作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
自从几天前发布了 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/
我是一名优秀的程序员,十分优秀!