簡體   English   中英

如何在WPF C#中使用背景工

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM