繁体   English   中英

是否可以在非异步方法中调用等待方法? [重复]

Is it possible to call an awaitable method in a non async method? [duplicate]

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

这个问题在这里已有答案:

在C#/ XAML的Windows 8应用程序中,我有时想从非异步方法调用一个等待的方法。

实际上替换它是正确的:

  public async Task<string> MyCallingMethod()
  {
      string result = await myMethodAsync();
      return result;
  }

这样 :

   public string MyCallingMethod()
   {
       Task.Run(async () => {
            string result = await myMethodAsync();
            return result;
             });
   }

对我来说的好处是我可以在没有等待的情况下使用MyCallingMethod,但这是正确的吗? 如果我想为MyCallingMethod传递ref参数,这可能是一个优点,因为在异步方法中不可能有ref参数。

2 个回复

在非异步方法中,您可以异步启动任务而不是等待结果:

public void MyCallingMethod()
{
    Task t = myMethodAsync();
}

或者你可以附上在完成任务后调用的ContinueWith事件处理程序,

public void MyCallingMethod()
{
    myMethodAsync().ContinueWith(
        result =>
        {
            // do stuff with the result
        });
}

或者您可以同步从任务中获取结果:

public string MyCallingMethod()
{
    string result = myMethodAsync().Result;
    return result;
}

如果你在UI线程上,你真的不应该尝试做类似的事情,因为这意味着你将阻止该线程。 您应该改为使用ref参数,例如通过接受包含要更改的值的简单类类型的参数。

不这样做的另一个原因是它仍然不允许你使用ref参数,因为lambdas不能访问封闭方法的ref参数。

但是如果你真的想这样做(再次,我认为你不应该),那么你将需要得到Task的结果。 就像是:

public string MyCallingMethod()
{
    var task = Task.Run(async () =>
    {
        return await myMethodAsync();
    });
    return task.Result;
}
1 在非异步方法中调用异步方法而不等待?

没有await和非异步方法调用异步方法的行为是什么? 我问,因为我看到Visual Studio在调用异步方法时没有显示任何警告,就好像这是一件非常正常的事情。 在这种情况下,异步方法的行为是否同步? ...

2 异步调用堆栈中的非异步方法[重复]

这个问题在这里已有答案: 在C#中“返回等待”的目的是什么? 7个答案 对不起一个可怕的头衔,我只想确认我做出了正确的假设。 假设我有3种方法简化为: Method2上面并没有异步工作在内部,但在我的异步栈。 它可以改写为: 我是否正确,因 ...

3 .Net调用异步方法并等待[重复]

这个问题在这里已有答案: 如何等待在WinRT中使用反射调用的异步私有方法? 2个答案 我有一个ansyc方法 我可以调用此方法异步并等待: 如何使用MethodInfo.Invoke调用该方法并异步等待结果。 ...

4 从非异步方法调用异步方法

我尝试的以下代码的每个变体都不起作用 - 无论是DoSomething() : void并按写入方式调用,还是DoSomething() : Task并使用TaskEx.RunEx()调用,一些尝试涉及.GetAwaiter().GetResult() 。 看到的错误包括: "Start may n ...

5 在非异步方法中调用异步方法

我有一个我要继承的类,并且我没有访问基类的权限。 我正在重写该基类的方法,并且该方法不是异步的,但是我需要它来调用我创建的异步方法。 像这样: 最好使用这种方法,在其中我提取“结果”值,还是应该向引擎添加一个新的同步方法,而完全忽略它的异步功能,像这样? 还是我可以完全对覆盖 ...

6 等待非异步方法

我对C#中的整个await / async模式完全感到困惑。 我有一个表单应用程序,我想调用一个方法,该方法需要20秒钟来进行大量处理。 因此,我想await它。 我认为正确的方法是将其标记为async Task ,但这样做是因为我不使用会产生一个警告await内的任何地方。 谷 ...

8 调用非异步方法

有一个使用 DbContext 从 sql 返回结果的类库。 如果我想建立一个 可能需要几秒钟的类库方法。 这个类在它的 Startup 中被注入到一个 asp.net core webapp 如果我打算从这样的代码中使用它,我是否也需要将此方法设为异步 ...

9 在非异步方法C中调用异步void方法

我在非异步方法中调用异步void函数时遇到问题。 我收到内部服务器错误。 我已经用谷歌搜索了这个问题,并找到了一些有关任务而不是任务的答案。 我的情况不是任务,所以我应该调用task.RunSynchronously()。 这将等待我的异步方法完成,然后继续进行下一步。 但是,当我调试 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM