2011-09-19 37 views
0

这个任何帮助非常感谢...企业库日志记录和任务并行库 - 从单独的线程写入日志?

我有一个WPF应用程序,我试图利用企业库(v5)日志记录功能来捕获某些事件。该应用程序都是.Net 4.0。

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

事件链完成后调用我在UI线程上运行的方法,允许我调用各种UI组件等。 Wtihin这种方法,我也试图写入我的日志...和应用程序简单地挂起。

总结:

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)这个任务完成后,通过延续,我的“包东西”方法的调用:

... 
// 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)我的“包扎事情”的方法尝试登录:

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 pinping。

编辑:我确信这是与UI/Dispatcher相关的,因为右键单击应用程序任务栏上的项目会“唤醒”它。

如果我可以添加更多的细节,请让我知道。

+0

我想补充一点,我创建了一个小的应用程序,以重新创建此,和往常一样很努力这样做!问题出现的应用程序要大得多,TPL用法更多 - 我假设某处我没有正确处理线程或同步上下文。 – Nick

回答

0

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

这样说,

我创建的只是休眠随机量的时间的一个简单TPL例如返回到UI之前(8和10分钟之间),它经由AsyncOperationManager发送更新,到UI的一切作品。

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

使用EL 5.0

+0

现在我的问题有些陈旧了,在这个项目中,我们实际上已经从各种原因转向使用EL。不过,我接受这一点是因为关于静态构造函数的建议是有效的,就像你的例子的描述一样......在这之后我又回到创建另一个模拟应用程序,这帮助我找到了一些流氓Task链接是我相信问题的原因。谢谢Mickey。 – Nick

相关问题