居然还有有的是替代品,以BackgroundWorker
,但你确实可以用它做任何事情了。有一次,我这样做是通过static
方法是这样的:
static BackgroundWorker StartWorker(DoWorkEventHandler _doWork,
ProgressChangedEventHandler _progressChanged,
RunWorkerCompletedEventHandler _runWorkerCompleted,
bool _workerReportsProgress,
bool _workerSupportsCancellation,
object arg)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = _workerReportsProgress;
worker.WorkerSupportsCancellation = _workerSupportsCancellation;
worker.DoWork += _doWork;
worker.ProgressChanged += _progressChanged;
worker.RunWorkerCompleted += _runWorkerCompleted;
try
{
worker.RunWorkerAsync(arg);
return worker;
}
catch (Exception ex)
{
//...
return null;
}
}
所以,你可以在这里通过拉姆达传递任何代表,如果方法的身体是相当小:
StartWorker((s, e) =>
{
object argument = e.Argument;
//do any work you need
},
(s, e) =>
{
//do smth on progress changed
},
(s, e) =>
{
//do smth on worker completed
},
true,
true,
null);//pass any argument you need
或者你可以使用明确写入方法...
如果您不需要,您可以省略ProgressChangedEventHandler
和RunWorkerCompletedEventHandler
中的任何一个。
谢谢。但我需要一些与concurrentQueue解决方案接近的东西,因为我不想为每个新任务启动新线程 – user236215