Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不同阶段执行嵌套异步函数_C#_Asynchronous_Async Await_Boolean_Task - Fatal编程技术网

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行代码。我也希望能够朝着“相反的方向”进行