[英]how to use Background Worker in WPF C# in a switch
一個流程到另一個流程后,如何一次在不同的Dowork中一次使用Background Worker?
我有以下代碼:
foreach (string item in Processes)
{
ItemValue = item;
//Get process code for the process under the selected source
GetActiveProcess();
switch (ProcessCode)
{
case "Download File":
GetStartTime();
UpdateDownloadStartTime();
if (worker.IsBusy != true)
{
worker.DoWork += new DoWorkEventHandler(worker_DoWorkDownload);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
break;
case "Unzip File":
GetStartTime();
UpdateDownloadStartTime();
if (worker.IsBusy != true)
{
worker.DoWork += new DoWorkEventHandler(worker_DoWorkUnzip);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
break;
}
}
這是我的DoWork和RunworkerCompleted的代碼
private void worker_DoWorkDownload(object sender, DoWorkEventArgs e)
{
DownloadFile();
}
private void worker_DoWorkUnzip(object sender, DoWorkEventArgs e)
{
ExtractFile();
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
GetEndTime();
GetDuration();
UpdateDownloadEndTime();
}
至於我的代碼,它將繼續同時執行Dowork。 我想做的是對Process中的每個項目執行Backgroundworker。
我怎樣才能做到這一點?
嘗試將開關移至DoWork處理程序,並在if塊中調用DownloadFile或其他文件,而不是訂閱和啟動backgroundworker。
為什么不切換到異步/等待呢?
foreach (string item in Processes)
{
ItemValue = item;
//Get process code for the process under the selected source
GetActiveProcess();
GetStartTime();
UpdateDownloadStartTime();
switch (ProcessCode)
{
case "Download File":
await Task.Run(DownloadFile);
break;
case "Unzip File":
await Task.Run(ExtractFile);
break;
}
GetEndTime();
GetDuration();
UpdateDownloadEndTime();
}
如果嘗試以非並行方式運行這些后台工作程序,則需要等到第一個后台工作功能完成后才能啟動下一個工作功能。
這意味着您需要以不同的方式從“流程”列表中刪除項目。 根據需要刪除第一項,設置工作程序並運行doWork,但隨后應刪除每個后續項,並在完成的處理程序中設置工作程序(worker_RunWorkerCompleted)
此外,您一直在向工作人員添加do work事件處理程序,而無需刪除它們。 而且,您只需要將一次worker_RunWorkerCompleted處理程序添加到工作程序中-不必對要處理的每個項目都執行此操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.