在 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。我的意思是,如果任务实际上已经完成,我就无法得到正确的结果。我应该为此使用标志吗?或者有更有效的方法?
您不能在 BackgroundWorker
的 DoWork
中使用 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
变量。
我每 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。我的意思是,如果任务实际上已经完成,我就无法得到正确的结果。我应该为此使用标志吗?或者有更有效的方法?
您不能在 BackgroundWorker
的 DoWork
中使用 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
变量。