异步线程生存期&WPF UI更新
本文关键字:UI 更新 WPF 线程 生存期 异步 | 更新日期: 2023-09-27 17:52:51
On button click我已经触发了对StartContinuousThread
的调用,它每秒钟轮询一次服务器。
public class ThreadsWindow
{
CancellationTokenSource wtoken = new CancellationTokenSource();
private void btnStartTest_Click(object sender, RoutedEventArgs e)
{
StartContinuousThread();
}
void StartContinuousThread()
{
while(true)
{
var fact = Task.Factory.StartNew(() =>
{
CallServer();
Task.Delay(1000, wtoken.Token);
},
wtoken.Token);
}
}
}
StartContinuousThread
开始执行,但btnStartTest_Click event handler
结束执行。
StartContinuousThread method
如何能够在此更新UI案例?我想知道
StartContinuousThread
是否也终止与事件处理程序,因为没有等待关键字重新加入。
请帮忙!
如果您的目标是每秒轮询服务器,那么您将遇到许多问题。
-
没有循环。方法执行一次,然后停止。
-
使用
Delay
创建任务,然后忽略它。你应该创建一个任务的延续来完成剩下的工作,而不是在一秒钟内做任何事情。
下面是解决这些问题的实现:
private async Task StartContinuousThread(CancellationToken token)
{
while (true)
{
token.ThrowIfCancellationRequested();
await Task.Run(() => CallServer());
await Task.Delay(1000, token);
}
}
另一种可能性,特别是如果你使用的是旧版本的c#,可以使用计时器来每秒运行一些代码。
对于UI的更新;在本例中,您可以在Task.Run
调用之外的任何地方自由地执行此操作。在您的示例中,您需要使用一些机制来封送回UI线程,例如捕获UI的同步上下文并向其发送。