【发布时间】:2015-07-03 11:56:55
【问题描述】:
我有以下课程:
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 方法并且执行是顺序的(“文件已复制...”事件总是首先执行)
我尝试过任务:
Task.Run(... OnLog())....
但问题在于,有时稍后创建的任务会引发一个在之前创建的任务的事件。 (正如预期的那样,考虑到我没有进行同步。)
我怀疑有一些最简单的方法可以完成此任务(顺序和异步调用事件)。
【问题讨论】:
-
类似
private object _syncRoot = new object();->public void SomeWork() { lock(_syncRoot){ /* Do some things... */ } }? -
您对
event模型的依恋程度如何?因为这迫使您将其保留在Integration内部。外部队列可能会更好。 -
这里的基本问题是班级试图做太多事情。
-
嗨@HenkHolterman!我不这么认为,你能解释一下原因吗?
标签: c# multithreading events asynchronous threadpool