同时执行两个单独的方法

瓦希德

我正在尝试两个人同时使用两个执行两个单独的方法Backgroundworker(或者,如果不可能使用另一个方法)来获得性能。想法是在方法中进行大量计算。

有可能吗?

private readonly BackgroundWorker _worker = new BackgroundWorker();
private readonly BackgroundWorker _worker2 = new BackgroundWorker();

public MainWindow()
{
    InitializeComponent();

    _worker.WorkerReportsProgress = true;
    _worker.WorkerSupportsCancellation = true;
    _worker.DoWork += worker_DoWork;
    _worker.RunWorkerAsync();

    _worker2.WorkerReportsProgress = true;
    _worker2.WorkerSupportsCancellation = true;
    _worker2.DoWork += worker_DoWork2;
    _worker2.RunWorkerAsync();
}

private void worker_DoWork(object sender, DoWorkEventArgs e)
{
    // Do something
}

private void worker_DoWork2(object sender, DoWorkEventArgs e)
{
    //  Do something simultaneously with worker_DorWork
}
尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

是的,有可能。如今,许多应用程序消耗多个线程来并行工作。在进行此类工作时,也必须注意这些陷阱。

例如,如果您享有WorkerA和WorkerB消耗共享资源,你将不得不做同步与任何同步原语(如MutexSemaphoreManualResetEvent,等),这是适合您的方案。

另外,请注意,分配新线程不是免费的,每个线程都有开销,例如每个创建的线程都有1MB堆栈。

请注意,我建议您研究更现代的库来进行并行工作,例如Task Parallel Library.NET 4.0中引入的具体来说,请查看TaskParallel类。

编辑

根据您在评论中的问题,让我们看看使用Taskvs是什么样子BackgroundWorker

BackgroundWorker:

_worker.WorkerReportsProgress = true;
_worker.WorkerSupportsCancellation = true;
_worker.DoWork += worker_DoWork;
_worker.RunWorkerAsync();

任务:

var task = Task.Run(worker_DoWork);

或者,如果您使用的是.NET 4.0:

var task = Task.Factory.StartNew(worker_DoWork);

您还可以得到的好处取消延续,并采用异步的awaitTask单位,这使得它更容易做到并行编程。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章