我想在后台线程中执行一些操作。但是,我想在后台工作程序中执行的方法的签名是不一样的。例如:
objA.method1(arg1)
objA.method2(arg2)
objB.method3(arg3)
objA.method4(arg4)
是否可以以允许我指定方法的对象,方法和参数的方式使用ConcurrentQueue或其他类,我想将其委托给我的工作线程?
我想使用类似于ConcurrentQueue的东西,这将允许我使用生产者 - 消费者模式来生成和消费工作。
答案 0 :(得分:0)
您可以使用匿名方法:
Queue<Action> Q;
Q.Enqueue(()=> objA.method1(arg1));
答案 1 :(得分:0)
实际上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
中的任何一个。