居然還有有的是替代品,以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