顺序调用循环中的异步方法

时间:2015-09-21 18:45:44

标签: c# multithreading events

我正在使用一些代码,这种代码以前从未处理过,我希望有人能够提供知识的火花:

有效的课程设置如下:

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:设置一个全局类布尔IsBlockedUpdate()设置为trueUpdateComplete()设置为false,并设置为for for循环(在{{ 1}}),只需输入Loop()

2 - 过于复杂:完全摆脱循环。改为从while (IsBlocked){}内部拨打Update(0);,然后Loop()拨打UpdateComplete()Update(1);,依此类推。

我想我希望像Update(2);之类的东西可以被另一个线程(另一个调用Thread.Pause的线程'远程'恢复' 任何想法都赞赏!

2 个答案:

答案 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如何做每一位,如果没有评论我可以添加代码