如何在UWP中正确使用CoreDispatcher的async和awiat

时间:2018-04-04 13:07:23

标签: c# multithreading uwp async-await

我想在后台执行一项涉及更改UI状态的任务,任务将在MainPage加载后开始执行。

所以我尝试在CoreDispatcher事件处理程序中使用Loaded,如下所示:

private async void Page_Loaded(object sender, RoutedEventArgs e)
{
    await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
    () => DrawingBoard.Arrange());
}

Arrange()方法:

public void Arrange()
{
    for(int i=1; i<95; i++)
        for(int j=1; j<85; j++)
            this.Children.Add(new Line{ /*initializing*/ });
}

出现此错误:

错误CS4036&#39; IAsyncAction&#39;不包含&#39; GetAwaiter&#39;的定义没有扩展方法&#39; GetAwaiter&#39;接受类型&#39; IAsyncAction&#39;的第一个参数。可以找到(你是否错过了&#39;系统&#39;的使用指令?)

但如果我不使用asyncawait关键字,则除了在该方法执行期间UI线程无响应外,没有任何错误。

我不知道如何使用await和异步CoreDispatcher。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:3)

它与async await无关。您将看到是否将using System;添加到顶部,它还将使用async和await命令进行编译,但仍然运行缓慢。

您的方法已被称为异步,但它必须创建95 * 85 = 8075行对象,在UI线程上执行此操作。由于Line是UI元素,因此您无法在后台执行此操作,但添加此类数量的UI元素需要一些时间。

有多种方法可以实现最佳化,但不知道你试图做什么,不可能给出建议如何以高效的方式工作