我正在使用一些代码,这种代码以前从未处理过,我希望有人能够提供知识的火花:
有效的课程设置如下:
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();
}
最大的警告是,在Update()
“返回”或被回拨之前,无法致电UpdateComplete()
。
忽略任何UI副作用,这个问题是否有一个简洁的解决方案?
我目前有两种策略 - 一种是hacky,一种是我觉得过于复杂:
1 - Hacky:设置一个全局类布尔IsBlocked
,Update()
设置为true
,UpdateComplete()
设置为false,并设置为for for循环(在{{ 1}}),只需输入Loop()
。
2 - 过于复杂:完全摆脱循环。改为从while (IsBlocked){}
内部拨打Update(0);
,然后Loop()
拨打UpdateComplete()
,Update(1);
,依此类推。
我想我希望像Update(2);
之类的东西可以被另一个线程(另一个调用Thread.Pause
的线程'远程'恢复'
任何想法都赞赏!
答案 0 :(得分:2)
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();
}
答案 1 :(得分:0)
使用QueueUserWorkItem
将更新发布到线程池中拥有已过帐商品数量的计数器。
让主线程等待AutoResetEvent
当每次更新完成时,锁定下的计数减少。
当计数达到0时设置AutoResetEvent以唤醒主线程
我没有发布任何代码cos我认为你可以google如何做每一位,如果没有评论我可以添加代码