C# 在不同阶段执行嵌套异步函数
如果我有:C# 在不同阶段执行嵌套异步函数,c#,asynchronous,async-await,boolean,task,C#,Asynchronous,Async Await,Boolean,Task,如果我有: server.Start(socket => { socket.doStuff() = async binary => { ... await Method1(); ... await Method2(); }; } 而且任务doSt
server.Start(socket =>
{
socket.doStuff() = async binary =>
{
...
await Method1();
...
await Method2();
};
}
而且任务doStuff()
被频繁调用(每20毫秒一次),我如何正确地在上首先执行doStuff()
调用,然后在所有后续的doStuff()
调用上执行Method2()
?我尝试使用布尔和if语句,如下所示:
server.Start(socket =>
{
socket.doStuff() = async binary =>
{
if(firstCall == true)
{
await Method1();
firstCall = false;
}
else
await Method2();
};
}
然而,我发现这段代码失败了,因为await Method1()代码>显然被调用了不止一次。因此,似乎在调用下一个doStuff()
时,还没有从第一个doStuff()
等待它,因为它仍在执行,因此,firstCall
仍然是true
,导致再次调用Method1()
。没有成堆的布尔函数,有可能做到这一点吗?我如何做到这一点
编辑
为了澄清<每次websocket接收到二进制消息(每20毫秒发生一次)时,都会调用code>.doStuff()
。我无法控制这一点,因此,在这些范围内工作:我只想调用Method1()
一次,我想在第一条消息(第一次调用.doStuff()
)时调用它。每隔调用.doStuff()
时,我希望调用Method2()
,而不是Method1()
。我还想确保一旦调用了Method1()
,它就在调用Method2()
之前完成了。如果我在这里丢失了一些二进制数据,这不是问题。像这样的东西怎么样:
var beforeFirst = true;
server.Start(socket =>
{
socket.doStuff = async () =>
{
if (beforeFirst) {
beforeFirst = false;
await Method1();
socket.doStuff = Method2;
}
};
}
- 第一次调用doStuff()时,它运行
Method1()
- 当调用doStuff()时,
它什么也不做Method1()
- 当
完成时,它将Method1()
替换为doStuff()
Method2()
唯一不好的是,设置和读取
之前的可能应该通过一些联锁的方法来避免在这个地方出现竞争状况。您是否在等待doStuff()
?是否需要一种方法而不是两种方法?这没有意义。听起来你想一个接一个地运行所有的方法。为什么不把所有的方法放在一个单独的异步运行的函数中并等待它呢?为什么要重复调用Dostuff?很抱歉,我解释错了,Dostuff()是一个动作,只要它从websocket连接接收二进制数据,就会被简单地调用。请包括调用Dostuff()
的代码。有趣的是,我对lambda表达式不是很熟悉,所以这个东西对我来说有点陌生。你的代码中还会有Method2()吗?我得到了一个错误,Method2()匹配委托“操作”时没有重载。
socket.doStuff=()=>Method2()
?太棒了,我不得不稍微修改你的代码来接受一个参数并运行异步,但它可以使用socket.OnBinary=async(binaryData)=>Wait Method2()
。比如说,经过一段时间后,我想重新启动这个过程,有没有一种简单的方法可以从socket.OnBinary=async(binaryData)=>wait Method2()
返回到socket.doStuff=async()=>{if(beforeFirst){beforeFirst=false;wait Method1();socket.doStuff=Method2;}代码>?当我重新分配socket.OnBinary()
时,我不希望包含整个原始方法,因为我在块中有大约60行代码。我也希望能够朝着“相反的方向”进行