在backgroundWorker中使用wait Task正在将我的状态更改为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
}
}

出于某种原因,当我使用wait…时"backgroundWorker.IsBusy"标志变为false。我的意思是,若任务真的完成了,我就不能得到正确的结果。我应该用旗子吗?还是有更有效的方法?

不能在BackgroundWorkerDoWork中使用await。我建议用Task.Run:完全替换BackgroundWoker

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变量。

最新更新