如何异步和顺序调用事件?

时间:2015-07-03 11:56:56

标签: c# multithreading events asynchronous threadpool

我有以下课程:

class Integration
{
    public event EventHandler<LogEventArgs> LogMessageEvent  

    protected virtual void OnLog(LogEventArgs e)
    {
         if(LogMessageEvent != null)
             LogMessageEvent(this, e);
    }

    public void SomeWork()
    { 
        //Do some things...

        var e = new LogMessageEvent("The file was copied...");
        OnLog(e);

        //Do more things...

        var e = new LogMessageEvent("Another thing...");
        OnLog(e);
    }
}

我需要事件订阅者不会阻止SomeWork方法并且执行是顺序的(&#34;文件被复制...&#34;事件始终执行首先)

我尝试过任务:

Task.Run(... OnLog())....

但问题是,有时创建的任务以后会在先前创建的任务之前引发事件。 (正如预期的那样,考虑到我没有做同步。)

我怀疑有一些最简单的方法可以完成此任务(按顺序和异步方式调用事件)。

1 个答案:

答案 0 :(得分:3)

存储您上次使用的SELECT pid, COUNT(pid) FROM products_order GROUP BY pid; - 对象并使用ContinueWith

它告诉您的任务在第一个任务完成后继续新的事件调用。因此,事件不会并行触发,而是顺序触发。

Task会返回一个新的ContinueWith - 对象,因此您需要更新您的引用,以便下一个Task - 调用成功。

这不是线程安全的,但只要你只从一个线程调用它就可以工作(并且对我来说很完美)。