在不同阶段执行嵌套的异步函数

时间:2018-09-11 13:15:03

标签: c# asynchronous async-await boolean task

如果我有

server.Start(socket =>
        {
            socket.doStuff() = async binary =>
            {
                 ...
                 await Method1();
                 ...
                 await Method2();
            };
        }

并且任务doStuff()被频繁调用(每20毫秒一次),如何正确执行 first Method1()调用,然后{{ 1}}之后的所有doStuff()通话中?我尝试使用布尔值和if语句,例如:

Method2()

但是,我发现这段代码失败了,因为显然doStuff()被多次调用了。因此,当调用下一个server.Start(socket => { socket.doStuff() = async binary => { if(firstCall == true) { await Method1(); firstCall = false; } else await Method2(); }; } 时,似乎await Method1();尚未从第一个doStuff()开始等待,因为Method1()仍在{{ 1}},导致doStuff()被再次调用。是否可以在没有大量布尔值的情况下完成此操作?我该如何实现?

编辑

为了澄清……每次firstCall都在websocket收到二进制消息(每20毫秒发生一次)时被调用。我无法控制它,因此,请在以下范围内工作:我只想一次调用true,并且希望在第一条消息上调用它(第一次{{1} })。每隔Method1()次调用一次,我希望被调用.doStuff(),并且 Method1()。我还想确保一旦调用.doStuff()后,它会在调用.doStuff()之前完成。如果我在这里丢失了一些二进制数据,那不是问题。

1 个答案:

答案 0 :(得分:1)

怎么样呢?

var beforeFirst = true;

server.Start(socket =>
{
    socket.doStuff = async () =>
    {
        if (beforeFirst) {
            beforeFirst = false;
            await Method1();
            socket.doStuff = Method2;
        }
    };
}
  • 第一次调用doStuff()时,它将运行Method1()
  • Method1()期间调用doStuff()时不执行任何操作。
  • Method1()完成后,它将doStuff()替换为Method2()

唯一的坏处是beforeFirst的设置和读取应该通过某种Interlocked方法来完成,以避免在此位置出现竞争状况。