実際、 には多くの代替手段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
andを省略できます。RunWorkerCompletedEventHandler