在 backgroundWorker 中使用 await Task 正在将我的状态更改为完成

Using await Task inside backgroundWorker is changing my status to complete

我每 7 秒使用一个循环。此循环与服务器通信。然后当服务器正在回答时,我正在等待用户回答有关服务器响应的问题。所以我需要检查所有这些过程是否已经完成。 所以我正在创建一个计时器

var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (sender, e) => backgroundWorker_DoWork(sender, e, frm);

var timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 10000;
timer.Elapsed += (sender, e) => Timer_Elapsed(sender, e);
timer.Start();

 private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
 {
    if (!backgroundWorker.IsBusy)
    {
      backgroundWorker.RunWorkerAsync();
    }
  }

private static async void backgroundWorker_DoWork(object sender, DoWorkEventArgs e, Main frm)
{
   using (var client = new HttpClient())
   {
      var result = await client.GetAsync(uri);
      //message to user for answering, then return it to server again
   }
 }

出于某种原因,当我使用 await... 时,'backgroundWorker.IsBusy' 标志变为 false。我的意思是,如果任务实际上已经完成,我就无法得到正确的结果。我应该为此使用标志吗?或者有更有效的方法?

您不能在 BackgroundWorkerDoWork 中使用 await。我推荐 replacing BackgroundWoker completely with Task.Run:

Task task = null;

var timer = new Timer();
timer.Interval = 10000;
timer.Tick += Timer_Tick;
timer.Start();

private static async void Timer_Tick(object sender, EventArgs e)
{
  if (task == null)
  {
    task = Task.Run(() => DoWorkAsync(frm));
    try { await task; }
    finally { task = null; }
  }
}

private static async Task DoWorkAsync(Main frm)
{
  using (var client = new HttpClient())
  {
    var result = await client.GetAsync(uri);
    //message to user for answering, then return it to server again
  }
}

旁注:我将 System.Timers.Timer 更改为 System.Windows.Forms.Timer,以便始终从 UI 线程访问 task 变量。