gpt4 book ai didi

c# - 在循环中依次调用异步方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:22:56 27 4
gpt4 key购买 nike

我正在处理一些代码,它采用了我以前从未处理过的方法,我希望有人能够提供知识的 Spark :

实际上类是这样设置的:

void Loop()
{
for (int i = 0; i < 100; i++)
{
//need to block calls to this until UpdateComplete is hit
Update(i);
}
}

void Update(int i)
{
//asynchronous - returns immediately
}

void UpdateComplete()//called from another thread
{
//unblock further calls to Update();
}

最大的警告是,在 UpdateComplete()“返回”或被回调之前,不可能调用 Update()

忽略任何 UI 副作用,是否有解决此问题的巧妙方法?

我目前有两种策略 - 一种很老套,另一种我觉得过于复杂:

1 - Hacky:设置一个全局类 bool 值 IsBlockedUpdate() 设置为 trueUpdateComplete() 设置为 false,在我的 for 循环中(在 Loop() 中),只需放入一个 while (IsBlocked){}

2 - 过于复杂:完全摆脱循环。从 Loop() 内部调用 Update(0);,让 UpdateComplete() 调用 Update(1);, Update(2); 等等。

我想我希望像 Thread.Pause 这样的东西可以被另一个线程远程“恢复”(调用 UpdateComplete() 的独立线程)任何想法表示赞赏!

最佳答案

这里也可以使用async/await

TaskCompletionSource<object> tcs = null;

async void Loop()
{
for (int i = 0; i < 100; i++)
{
tcs = new TaskCompletionSource<object>();
Update(i);
await tcs.Task;
}
}

void Update(int i)
{
//asynchronous - returns immediately
}

void UpdateComplete()//called from another thread
{
tcs.TrySetResult(null);
//unblock further calls to Update();
}

关于c# - 在循环中依次调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32702480/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com