【问题标题】:Multiple await's inside an async method异步方法中的多个等待
【发布时间】:2017-05-10 11:37:39
【问题描述】:

我有一个方法

public async void getResult ()

这依赖于其中的 2 个等待响应。

这是第一个:等待:

await System.Threading.Tasks.Task.Factory.StartNew (() => { 
                    try 
                    {
                        scannedItem = getScannedItem(); 
                    }
                    catch (Exception exe) 
                    { }

第二个使用 scannedItem 的 await await 调用

await System.Threading.Tasks.Task.Factory.StartNew (() => { 
                    try
                    {
                        getResultsScannedItem = results(ScannedItem); 
                    }
                    catch (Exception exe) 
                    { }

我想让这一切都通过一个按钮执行。但是,第二个 await 永远不会被执行。我什至可以在一个方法中有两个等待吗?有点困惑如何去做。

【问题讨论】:

  • 有什么理由不能把第二个任务的主体放在第一个任务中? IE。 await Task.Factory.StartNew( ()=> { try { scannedItem = getScannedItem(); getResultsScannedItem = result( scannedItem ); } ...
  • @clcto 我试着把它放在第一个里面,但我得到了错误:“只有当它包含的 lambda 表达式用 'async' 修饰符标记时,才能使用'await'运算符”

标签: c# asynchronous xamarin async-await


【解决方案1】:

是的,您可以在一个方法中拥有多个等待 .. 但这些看起来不像可等待的任务 .. 您只是用任务工厂将它们包装起来。

您似乎还吞下了代码中可能发生的任何异常。

尝试更改为:

await Task.Run(() => scannedItem = getScannedItem());

await Task.Run(() => getResultsScannedItem = results(ScannedItem));

使用调试器单步执行它,看看它是否正在运行或发生异常。

【讨论】:

  • 去掉try 和catch 本身就值得+1。
  • 我还要添加一个关于 void 返回类型的注释。除了事件处理程序之外,您永远不应该在异步方法上返回 void。 public async void getResult () 应该变成 public async Task getResult ()
  • 是的..应该返回Task
  • 我将如何使用我的代码进行设置? @tequilaslammer
  • 正如我所写,只需将void 替换为Task。
【解决方案2】:
public async void getResult ()
{
     ScannedItem scannedItem;
     try 
     {
        scannedItem = await getScannedItem(); 
        getResultsScannedItem = await results(scannedItem);   
     } catch (Exception exe) { }
}

您应该将“异步”添加到 getScannedItem 和结果函数。希望能帮助到你。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多