C# 理解.NET中的等待和异步

C# 理解.NET中的等待和异步,c#,async-await,c#-5.0,C#,Async Await,C# 5.0,我正在重构代码,该代码使用引导协议来更新机器中多个节点的固件。当前代码如下所示(伪代码): 我想做的是将其转换为async await,但仍然要求不立即返回调用方。我该怎么做呢?这可能吗?既然wait-async一直传播到顶部,那么这是正确的做法吗 我认为这应该是什么样子的伪代码: public void StartUpdate() { bool result = await SendMagicPacket(); bool IsError = await BOOTPCommuni

我正在重构代码,该代码使用引导协议来更新机器中多个节点的固件。当前代码如下所示(伪代码):

我想做的是将其转换为async await,但仍然要求不立即返回调用方。我该怎么做呢?这可能吗?既然wait-async一直传播到顶部,那么这是正确的做法吗

我认为这应该是什么样子的伪代码:

public void StartUpdate()
{
    bool result = await SendMagicPacket();
    bool IsError = await BOOTPCommunication(); //Handles all of the BOOTP recieve/sends
    //don't return to caller until BOOTPCommunication is completed. How do i do this?
}

您需要等待这两项任务,请尝试以下操作:

public async Task StartUpdate()
    {
        var resultTask =  SendMagicPacket();
        var isErrorTask = BOOTPCommunication(); //Handles all of the BOOTP recieve/sends

        await Task.WhenAll(new[]{resultTask, isErrorTask});
        //don't return to caller until BOOTPCommunication is completed. How do i do this?
    }
public async Task StartUpdate()
{
    var resultTask =  SendMagicPacket();
    var isErrorTask = BOOTPCommunication(); //Handles all of the BOOTP recieve/sends

    Task.WhenAll(new[]{resultTask, isErrorTask}).Wait(); //Wait() will block so that the method doesn't return to the caller until both of the asynchronous tasks complete.
}

您需要等待这两项任务,请尝试以下操作:

public async Task StartUpdate()
    {
        var resultTask =  SendMagicPacket();
        var isErrorTask = BOOTPCommunication(); //Handles all of the BOOTP recieve/sends

        await Task.WhenAll(new[]{resultTask, isErrorTask});
        //don't return to caller until BOOTPCommunication is completed. How do i do this?
    }
public async Task StartUpdate()
{
    var resultTask =  SendMagicPacket();
    var isErrorTask = BOOTPCommunication(); //Handles all of the BOOTP recieve/sends

    Task.WhenAll(new[]{resultTask, isErrorTask}).Wait(); //Wait() will block so that the method doesn't return to the caller until both of the asynchronous tasks complete.
}
//等待BOOTP/Update完成,然后返回调用方

您根本不需要任何异步IO,因为您希望等待所有操作完成。我假设您复制了一些示例代码。大多数示例代码使用异步套接字API

将所有内容切换到同步套接字API,就完成了

如果出于某种原因希望保持此异步,您确实可以切换到等待并解开此代码。您发布的伪代码看起来是个不错的目标。但是,它强制周围的方法是
异步任务

您也可以通过使所有调用者递归异步来处理这个问题。如果您不需要保留线程,您可以阻止该任务,并拥有一个基本同步的调用链。不过,到那时,您将失去所有异步好处

//等待BOOTP/Update完成,然后返回调用方

您根本不需要任何异步IO,因为您希望等待所有操作完成。我假设您复制了一些示例代码。大多数示例代码使用异步套接字API

将所有内容切换到同步套接字API,就完成了

如果出于某种原因希望保持此异步,您确实可以切换到等待并解开此代码。您发布的伪代码看起来是个不错的目标。但是,它强制周围的方法是
异步任务


您也可以通过使所有调用者递归异步来处理这个问题。如果您不需要保留线程,您可以阻止该任务,并拥有一个基本同步的调用链。不过,在这一点上,您将失去所有异步好处。

Radin走上了正确的道路,但我认为您想要的是这样的:


您需要等待这两项任务,请尝试以下操作:

public async Task StartUpdate()
    {
        var resultTask =  SendMagicPacket();
        var isErrorTask = BOOTPCommunication(); //Handles all of the BOOTP recieve/sends

        await Task.WhenAll(new[]{resultTask, isErrorTask});
        //don't return to caller until BOOTPCommunication is completed. How do i do this?
    }
public async Task StartUpdate()
{
    var resultTask =  SendMagicPacket();
    var isErrorTask = BOOTPCommunication(); //Handles all of the BOOTP recieve/sends

    Task.WhenAll(new[]{resultTask, isErrorTask}).Wait(); //Wait() will block so that the method doesn't return to the caller until both of the asynchronous tasks complete.
}

这样做的目的是将magicpacket和BOOTPCommunication同时发送到两个fire,但要等待两者完成。使用该模式,您可以同时触发N个事件,同时使用Wait()等待所有事件完成,以便方法本身同步返回。

Radin的方法是正确的,但我认为您需要的是这样的:


您需要等待这两项任务,请尝试以下操作:

public async Task StartUpdate()
    {
        var resultTask =  SendMagicPacket();
        var isErrorTask = BOOTPCommunication(); //Handles all of the BOOTP recieve/sends

        await Task.WhenAll(new[]{resultTask, isErrorTask});
        //don't return to caller until BOOTPCommunication is completed. How do i do this?
    }
public async Task StartUpdate()
{
    var resultTask =  SendMagicPacket();
    var isErrorTask = BOOTPCommunication(); //Handles all of the BOOTP recieve/sends

    Task.WhenAll(new[]{resultTask, isErrorTask}).Wait(); //Wait() will block so that the method doesn't return to the caller until both of the asynchronous tasks complete.
}

这样做的目的是将magicpacket和BOOTPCommunication同时发送到两个fire,但要等待两者完成。使用该模式可以同时触发N个事件,同时使用Wait()等待所有事件完成,以便方法本身同步返回。

这并不能解决我的问题。Wait仍将立即返回到StartUpdates()调用方。@Stacker,
Wait
不会返回到
StartUpdate
方法的调用方。它只是通知CLR异步执行代码并释放线程。这并不能解决我的问题。Wait仍将立即返回到StartUpdates()调用方。@Stacker,
Wait
不会返回到
StartUpdate
方法的调用方。它只是通知CLR异步执行代码并释放线程。这都是同步的。我不知道上一个人为什么异步这么做。你是对的,我一直在想这一切都错了。这都是同步的。我不知道上一个人为什么异步地做这件事。