【发布时间】:2020-03-09 17:48:16
【问题描述】:
我正在等待返回网络响应时尝试更新状态消息。该调用将文件发布到服务器,有时可能需要 30 多秒。
如果通话花费的时间比预期的要长,我想更新消息(Windows 窗体文本框文本)。如果呼叫已等待 15 秒,请将消息更新为“这需要一段时间,但应该很快完成。”
我试过了:
- 异步触发并忘记
- 使用调用的计时器
- task.run
- 两个任务都是异步的,等待网络调用任务
- 使用 dowork 和进度工作的后台 Worker
似乎没有任何效果。是否有可能在任务锁定线程时更新主线程?
我正在使用简单的调用进行测试:
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
while (!worker.CancellationPending)
{
Task.Delay(1000).Wait();
this.Invoke((MethodInvoker)delegate
{
this.box.Text += '.';
this.box.Update();
});
}
}
private void MakeCall()
{
worker.RunWorkerAsync();
using (WebClient client = new WebClient())
{
//Just runs Task.Delay(10000) then returns "Complete"
var res = client.DownloadString("https://localhost:44343/api/TestDelay");
MessageBox.Show(res);
}
worker.CancelAsync();
}
private void button_Click(object sender, EventArgs e)
{
MakeCall();
}
【问题讨论】:
-
您需要调用文本框才能更新文本。
this.Invoke不是文本框。上面在StartMinder中也给出了它被标记为async,使用invoke与该方法相矛盾,因为invoke也是一个阻塞调用。 -
另外,
private async Task MakeCall()VS 应该吐了,因为您在该例程中没有awaiting 任何东西。 -
它确实给出了标准的无等待错误,但我将它标记为异步作为我测试的一部分,以尝试让它们根据需要工作。将调用切换到 this.box.invoke 也不起作用。
-
@Çöđěxěŕ 您可以调用父级。无论如何,这就是预期的封送处理程序。
-
@Jimi 我知道你可以,我没说你不能。在这种情况下,为什么 OP 会调用父级?