【问题标题】:Custom async Method自定义异步方法
【发布时间】:2013-06-29 21:24:23
【问题描述】:

有没有办法在 WP7 - WP8 中对自定义方法进行异步调用?

在 Windows 窗体应用程序中,我只需这样做:

private void btnStart_Click(object sender, EventArgs e)
{
    MyMethod();
}

private async void MyMethod()
{
    await System.Threading.Tasks.Task.Run(() => Thread.Sleep(5000));
}

但是,WP 应用似乎不支持 System.Threading.Tasks 命名空间。

如果我希望在我的 WP7 - WP8 应用程序中进行类似操作,我应该怎么做?

【问题讨论】:

    标签: c# windows-phone-7 asynchronous windows-phone-8 async-await


    【解决方案1】:

    您可以安装 Microsoft.Bcl.Async 以获得 WP7.5 支持。如果您需要 WP7.0 支持,最好的选择是BackgroundWorker

    附:您的 WinForms 示例最好写成:

    private async void btnStart_Click(object sender, EventArgs e)
    {
        await Task.Run(() => MyMethod());
    }
    
    private void MyMethod()
    {
        Thread.Sleep(5000);
    }
    

    遵循这些最佳做法:

    1. 避免async void
    2. 不要在通用库方法中使用Task.Run

    【讨论】:

    • 谢谢你,但我还是有问题。我为 TextBox.TextChanged 事件编写了一个异步事件处理程序,但是当我尝试执行此操作时,我收到一条错误消息,指出“无效的跨线程调用”:await TaskEx.Run(() => MyMethod());或等待 Task.Factory.StartNew(() => MyMethod());我该如何解决这个问题?
    • 任何 UI 更新都需要在 UI 线程上完成,因此它们不能在对 Task.Run 的调用中进行。您需要将MyMethod 拆分为“背景”部分和“UI”部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 2020-05-20
    • 2017-05-11
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多