企业库日志和任务并行库——从一个单独的线程写入日志

本文关键字:日志 单独 一个 线程 任务 并行 企业库 | 更新日期: 2023-09-27 18:09:06

任何帮助都非常感谢…

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

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

事件链以调用我在UI线程上运行的方法结束,允许我更新各种UI组件等。在这种方法中,我也试图写我的日志…应用程序只是挂起。

总结:

1)我有一个静态'logging'类,允许我用通常的方法解析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)这个任务通过continuation结束,调用我的"wrap things 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!
}

My Logging被配置为以本地文件夹中的滚动平面文件为目标。来自UI线程的任何调用都可以正常工作。似乎只有来自TPL之外的调用才会被锁。

我读过一篇关于不能同时从多个源写入单个文件的文章(我并没有尝试这样做,我在上面的第4点确保没有其他东西试图记录)。

我也在这里看到了一篇关于线程安全的文章,我想知道这是否相关。

编辑:我也试过像这里讨论的那样显式地调用日志写入,这是在StackOverflow文章中ping的。

编辑:我确信这是与UI/Dispatcher有关,因为在应用程序任务栏项目上快速单击右键"唤醒"它。

如果我能补充更多的细节,请告诉我。

企业库日志和任务并行库——从一个单独的线程写入日志

首先,使用静态构造函数初始化静态记录器,并使用静态字段与它通信。不断使用工厂会浪费很多开销(每次你记录一些东西时,它都会检查配置文件)。

话虽如此,

我创建了一个简单的TPL示例,在返回UI之前只是随机睡眠时间(在8到10分钟之间),它通过AsyncOperationManager向UI发送更新,一切都工作。

我不能重复你的问题。你能详细说明一下吗?

使用EL 5.0