【问题标题】:Implement asnyc method inside a Thread在线程内实现异步方法
【发布时间】:2018-05-07 18:01:21
【问题描述】:

我正在 Visual Studio 2017 中处理 Xamarin Forms 项目。我需要在线程中实现异步方法。

启动线程的事件

   public void btnAction_Click(object sender, System.EventArgs e)
    {
        var load = new System.Threading.Thread((t) =>
        {
           ShowWarning();

        });
        load.Start(btnText);

    }

异步方法应该在线程内部实现

 private async void ShowWarning()
 {
       bool response = await  DisplayAlert("Warning", "Please Enter
                            The Key","Yes","No");
 }

【问题讨论】:

  • async void 仅用于事件处理程序。为什么要使用线程?
  • 为什么需要这样做? “在线程中实现任务in”是什么意思?
  • 在该方法中还有另一部分功能(此处未提及),这就是为什么我将其放在线程中

标签: c# xamarin xamarin.forms


【解决方案1】:

如果DisplayAlert 真的是异步,那你为什么要启动一个线程呢?您可以声明您的事件处理程序 async 并简单地 awiat ShowWarning:

public async void btnAction_Click(object sender, System.EventArgs e)
{
    await ShowWarning();
}

您可能希望在await 之前禁用btnAction,并在await 之后再次启用它,这样您就可以在等待时避免再次点击事件。


请注意,将ShowWarning 声明为async void 是一种不好的做法。应该是

private async Task ShowWarning()
{ ... }

(如果是按钮事件处理程序,可以返回 async void,否则您无法将其分配给事件)。


如果你真的需要在不同的线程上运行ShowWarning,你可以使用Task.Run()

public async void btnAction_Click(object sender, System.EventArgs e)
{
    await Task.Run(ShowWarning);
}

【讨论】:

  • 在该方法中还有另一部分功能(此处未提及),这就是为什么我将其放在线程中
  • @charitht99perera 这就是为什么你应该在你的问题中发布相关代码。我更新了答案。
  • 抱歉,我删除了它,因为它可能会造成混淆