企业库日志记录和任务并行库 - 从单独的线程写入日志?

时间:2011-09-19 15:24:28

标签: c# multithreading logging enterprise-library

对此的任何帮助都非常感谢...

我有一个WPF应用程序,我正在尝试利用Enterprise Library(v5)日志记录功能来捕获某些事件。该应用程序全部是.Net 4.0。

我有几个长时间运行的进程,并且正在使用任务并行库在必要时进行多线程处理。我使用Task.Factory.StartNew语法,并有几个延续来控制流程。

事件链完成后调用我在UI线程上运行的方法,允许我修改各种UI组件等。使用这种方法,我也试着写入我的日志...而应用程序只是挂起。

总结:

1)我有一个静态'日志记录'类,允许我用常用方法解析Logger的一个实例:

public static void LogThis(string message)
{    
LogWriter logWriter = EnterpriseLibraryContainer.Current.GetInstance<LogWriter>();
logWriter.Write(message, "My Default Logging Category");
}

2)我有一个任务工厂电话,开始了我的长期工作:

...
var longProcess = Task.Factory.StartNew(() => ThisMethodTakesAWhile(variable));
...

3)此任务通过延续完成,调用我的'wrap thing up'方法:

... 
// longProcess is the task coming out of the Factory call in point 2.
// We use the Current Sync Context to allow us to come back to the UI thread.
longProcess.ContinueWith(ant => WrapThingsUp(ant.Result), CancellationToken.None, TaskContinuationOptions.NotOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());
...

4)我的'wrap things up'方法尝试记录:

private void WrapThingsUp(string resultOfLongProcess)
{
//This call locks the applicaiton.
LogThis("Just to let you know I've finished that long task");
// I never get here!
}

我的日志记录配置为在本地文件夹中定位滚动平面文件。来自UI线程的任何调用都可以正常工作。它似乎只是来自TPL的来电锁定。

我已经阅读过关于无法同时从多个源写入单个文件的文章(我不打算这样做,我在上面的第4点确保没有其他任何东西试图登录)。

我也看过关于线程安全的文章here,我想知道这是否相关。

编辑:我也尝试过显式调用日志写,如here所述,该文章已在StackOverflow文章here中进行了说明。

编辑:我确信这与UI / Dispatcher有关,因为右键快速点击应用程序任务栏项“唤醒”它。

如果我可以添加更多细节,请告诉我。

1 个答案:

答案 0 :(得分:0)

首先,使用静态构造函数初始化静态记录器,并使用静态字段与之通信。 你经常使用工厂浪费大量的开销(每次你记录的时候都会检查配置文件)。

说,

我创建了一个简单的TPL示例,它只是在返回UI之前随机休息一段时间(8到10分钟),它通过AsyncOperationManager发送更新到UI,一切正常。

我无法重复你的问题。你能详细说明吗?

使用EL 5.0