我正在try 使用异步/等待功能,但有不同的执行路由,我想知道这样的事情是否可能发生.

我有以下代码:

public class Example
{
    public void DoSomething()
    {
        Console.WriteLine("DoSomething Start:");
        DoMore();
        Console.WriteLine("DoSomething End:");
    }

    public async void DoMore()
    {
        Console.WriteLine("DoMore Start:");
        await Task.Run(() => Thread.Sleep(1000));
        Console.WriteLine("DoMore End:");
    }
}

当我拨打DoSomething的时候,我会得到:

DoSomething Start:
DoMore Start:
DoSomething End:
DoMore End:

我希望执行DoSomething的线程等待in a non blocking way等待DoMore结束,然后继续执行DoSomething(类似于在DoMore调用中使用等待). 生成的输出应为:

DoSomething Start:
DoMore Start:
DoMore End:
DoSomething End:

我可以使用以下代码:

public class Example
{
    public async void DoSomething()
    {
        Console.WriteLine("DoSomething Start:");
        await Task.Run(() => DoMore());
        Console.WriteLine("DoSomething End:");
    }

    public async void DoMore()
    {
        Console.WriteLine("DoMore Start:");
        await Task.Run(() => Thread.Sleep(1000));
        Console.WriteLine("DoMore End:");
    }
}

但这为DoMore使用了一个不同的线程,这是我不需要的.

推荐答案

async方法调用代码会产生编译错误CS4008: Cannot await 'void'.解决方案是replacing the two 102 types with 103,并从一个blog方法调用DoSomething().关键的一点是,Don't Block on Async Code和使用的所有方式下降.

这将完成以下工作:

public class Example
{
    public async Task DoSomething()
    {
        Console.WriteLine("DoSomething Start:");
        await DoMore();
        Console.WriteLine("DoSomething End:");
    }

    public async Task DoMore()
    {
        Console.WriteLine("DoMore Start:");
        await Task.Run(() => Task.Delay(1000));
        Console.WriteLine("DoMore End:");
    }
}

输出:

DoSomething Start:
DoMore Start:
DoMore End:
DoSomething End:

Csharp相关问答推荐

C#相同名称的枚举方法和normal方法,参数类型不同

如何保持主摄像头视角保持一致?

System. InvalidOperationException:无法将数据库中的字符串值i转换为映射的ItemType枚举中的任何值''''

如何告诉自己创建的NuGet包在应用程序中发生了变化?

如何使用自定义负载均衡器管理Ocelot负载均衡器中的多线程和批读取

按需无缝转码单个HLS数据段

异步任务调用程序集

如何在.NET AOT中为所有枚举启用JsonStringEnumConverter

有条件地定义预处理器指令常量

是否可以在Entity Framework Core中使用只读 struct 作为拥有实体?

Azure函数正在返回值列表,但该列表在Chrome中显示为空

如何在单击按钮后多次异步更新标签

Autofac -动态实例化:手动传递构造函数

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

Xamarin中出错.表单:应用程序的分部声明不能指定不同的基类

最小API定义的Swagger标头参数

如何对构建在Clean架构和CQRS之上的控制器进行单元测试?

无法创建工具窗口(用于VBIDE、VBA的COM加载项扩展)

无法停止PowerShell中的低级挂钩(c#挂钩)

如何提高C#中比较大 struct 的性能?