我想在后台线程中执行一些操作。但是,我想在后台工作人员中执行的方法的签名并不相同。例如:
objA.method1(arg1)
objA.method2(arg2)
objB.method3(arg3)
objA.method4(arg4)
是否可以使用 ConcurrentQueue 或其他类以允许我指定要委托给工作线程的对象、方法和方法的参数?
我想使用类似于 ConcurrentQueue 的东西,它允许我使用生产者-消费者模式来生成和使用工作。
我想在后台线程中执行一些操作。但是,我想在后台工作人员中执行的方法的签名并不相同。例如:
objA.method1(arg1)
objA.method2(arg2)
objB.method3(arg3)
objA.method4(arg4)
是否可以使用 ConcurrentQueue 或其他类以允许我指定要委托给工作线程的对象、方法和方法的参数?
我想使用类似于 ConcurrentQueue 的东西,它允许我使用生产者-消费者模式来生成和使用工作。
您可以使用匿名方法:
Queue<Action> Q;
Q.Enqueue(()=> objA.method1(arg1));
实际上有很多替代品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;
}
}
因此,如果方法的主体相当小,您可以通过 lambda 在此处传递任何委托:
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
如果您不需要它们,您可以省略其中的任何一个。