I'm using a StaTaskScheduler (TPL extension) to open some web browser windows simultaneously and navigate to different sites (using WatiN, but it might as well just be a WebBrowser
).
In my example below I'm running 5 concurrent browsers. Works fine, but it locked the UI thread, so I wrapped my tasks in a BackgroundWorker
. Seems like it does the job, but is it the correct way of handling the issue? Do I need to dispose the worker once I'm done? And finally, is lock (ret)
the correct way of keeping ret
thread safe?
StaTaskScheduler sta = new StaTaskScheduler(5);
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (s, ea) =>
{
List<string> ret = new List<string>();
lock (ret)
Task.WaitAll(Util.GetList().Select(row => Task.Factory.StartNew(() =>
{
IEnumerable<string> result = DoUiLockingWork(row.Item1, row.Item2);
ret.AddRange(result);
}, CancellationToken.None, TaskCreationOptions.None, sta)).ToArray());
ea.Result = ret;
};
bw.RunWorkerCompleted += (s, ea) =>
{
List<string> result = ea.Result as List<string>;
if (result != null)
Debug.WriteLine(result.Count);
};
bw.RunWorkerAsync();