如果我有
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()
之前完成。如果我在这里丢失了一些二进制数据,那不是问题。
答案 0 :(得分:1)
怎么样呢?
var beforeFirst = true;
server.Start(socket =>
{
socket.doStuff = async () =>
{
if (beforeFirst) {
beforeFirst = false;
await Method1();
socket.doStuff = Method2;
}
};
}
Method1()
。Method1()
期间调用doStuff()时不执行任何操作。Method1()
完成后,它将doStuff()
替换为Method2()
。唯一的坏处是beforeFirst
的设置和读取应该通过某种Interlocked
方法来完成,以避免在此位置出现竞争状况。