gpt4 book ai didi

c# - 从 WinRT 中的线程更新 UI

转载 作者:可可西里 更新时间:2023-11-01 03:05:29 27 4
gpt4 key购买 nike

自从几天前发布了 Windows 8 消费者预览版以来,我正在使用 C# 开发新的 WinRT(适用于 Metro 应用程序),并将我自己编写的 IRC 类移植到新的线程和网络。

问题是:我的类正在运行一个从服务器接收消息的线程。如果发生这种情况,线程会进行一些解析,然后触发一个事件来通知应用程序这件事。订阅的函数然后“应该”更新 UI(一个文本 block )。

这就是问题所在,线程无法更新 UI,并且与 .NET 4.0 一起使用的调用程序方法似乎不再可行。是否有新的解决方法或更新 UI 的更好方法?如果我尝试从事件订阅者更新 UI,我将得到此 Exception:

The application called an interface that was marshalled for a different thread (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

最佳答案

在 WinRT(和一般的 C# 5)中处理这个问题的首选方法是使用 async-await:

private async void Button_Click(object sender, RoutedEventArgs e)
{
string text = await Task.Run(() => Compute());
this.TextBlock.Text = text;
}

此处,Compute() 方法将在后台线程上运行,当它完成时,该方法的其余部分将在 UI 线程上执行。同时,UI 线程可以自由地做任何它需要的事情(比如处理其他事件)。

但如果您不想或不能使用 async,您可以使用 Dispatcher,其方式与 WPF 中的方式类似(尽管不同):

private void Button_Click(object sender, RoutedEventArgs e)
{
Task.Run(() => Compute());
}

private void Compute()
{
// perform computation here

Dispatcher.Invoke(CoreDispatcherPriority.Normal, ShowText, this, resultString);
}

private void ShowText(object sender, InvokedHandlerArgs e)
{
this.TextBlock.Text = (string)e.Context;
}

关于c# - 从 WinRT 中的线程更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9540260/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com