对此的任何帮助都非常感谢...
我有一个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有关,因为右键快速点击应用程序任务栏项“唤醒”它。
如果我可以添加更多细节,请告诉我。
答案 0 :(得分:0)
首先,使用静态构造函数初始化静态记录器,并使用静态字段与之通信。 你经常使用工厂浪费大量的开销(每次你记录的时候都会检查配置文件)。
说,
我创建了一个简单的TPL示例,它只是在返回UI之前随机休息一段时间(8到10分钟),它通过AsyncOperationManager发送更新到UI,一切正常。
我无法重复你的问题。你能详细说明吗?
使用EL 5.0