时间:2019-03-07 标签:c#awaitabletask留在相同的上下文中

标签 c# multithreading asynchronous async-await task

这是我所拥有的:

  • 多平台 (Xamarin/C#) 应用程序

  • 定义具有特定于平台的实现的方法(针对 UI 任务)的接口(interface)

  • 在一个平台上,实现需要等待一些异步调用,而在另一个平台上则不需要

我的实现:

  • 接口(interface)将方法定义为:Task DoSomething()

  • 在实现必须等待异步调用的平台上

该方法的实现为:

async Task DoSomething()
{
  // code
  await // async();
  // code
}

效果很好

  • 在实现不调用其他异步方法的平台上,我有 2 个选项:

    1. 将该方法定义为async Task DoSomething(),并收到编译时警告“此异步方法缺少 'await' 运算符,将同步运行...”

    2. 将方法定义为返回 Task.Run(() => {/这里是主要逻辑/}) 的 Task DoSomething() ,但是当我调用await DoSomething() - 主要逻辑在另一个线程上执行,我不希望发生这种情况。通过(1)中的实现,调用await DoSomething保持在同一个线程上。

如何解决此问题 - 返回一个非异步且保留在同一线程/上下文上的可等待任务?

最佳答案

您应该使用return Task.FromResult(returnValueHere)。它会稍微快一些并且会保持在同一个线程中。并且不要忘记从方法声明中删除async

如果您的方法没有返回任何内容,您也可以简单地使用return Task.FromResult(0)

public Task DoSomething()
{
    // Work done here
    return Task.FromResult(0);
}

关于时间:2019-03-07 标签:c#awaitabletask留在相同的上下文中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40498763/

相关文章:

c# - 未捕获异步异常

c# - 如何提取通用/相似代码块以在 Visual Studio C# 中运行

firebase - whenComplete() 方法未按预期工作 - Flutter Async

c# - 覆盖 .net Web API 中操作映射和参数的基本功能

java - 在java中的不同类中的线程之间同步共享变量?

java - LinkedBlockingQueue .take() 性能

multithreading - 如何从另一个线程(Glib线程)取消一个线程?

ios - 连续调用 UIViewController 的 presentViewController 方法

c# - 如何在不闪烁的情况下为 C# 中的 winforms 自定义控件设置动画?

c# - 如何从字符串中删除小数部分?