【发布时间】:2023-03-11 16:50:02
【问题描述】:
我正在处理一些代码,它具有我以前从未处理过的方法,并希望有人能够提供知识的火花:
实际上这个类是这样设置的:
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:设置一个全局类布尔值IsBlocked,Update() 设置为true,UpdateComplete() 设置为 false,在我的 for 循环中(在 Loop() 中),只需放入一个 @ 987654329@.
2 - 过于复杂:完全摆脱循环。而是从Loop() 内部调用Update(0);,并让UpdateComplete() 调用Update(1);、Update(2); 等等。
我想我希望像Thread.Pause 这样的东西可以被另一个线程远程“恢复”(调用UpdateComplete() 的单独线程)
任何想法表示赞赏!
【问题讨论】:
-
我会使用
async/await -
把代码放在它所属的地方。向 Update() 添加另一个参数,一个名为“executeAsychronously”的布尔值。
-
您描述的两种方式都没有提供线程的任何优势。它们始终有效地在单个线程上运行,它们只是从一个线程跳到另一个线程。所以它只会使事情复杂化。
标签: c# multithreading events