1

我需要为我的应用程序创建一个单独的线程来记录一些事情,并且建议我使用 Task.

我似乎没有这个权利,因为我不完全理解任务(我猜)。

这是我所拥有的:

public static void LogException(string message, Exception ex)
{
  Action action= delegate() { logException(message, ex); };
  new Task(action);
}

public static void logException(string message, Exception ex)
{
  var stackTrace = new StackTrace();
  var origin = stackTrace.GetFrame(1).GetMethod().Name;
  var originclass = stackTrace.GetFrame(1).GetMethod().ReflectedType.Name;
  var neworigin = string.Format("{0}.{1}", originclass, origin);

  message += Environment.NewLine + Environment.NewLine + GetFullExceptionMessage(ex);

  if (string.IsNullOrEmpty(message)) message = "No message given";

  //var exceptions = GetAllErrMessages(ex);
  //message = exceptions.Aggregate(message, (current, exception) => current + Environment.NewLine + exception);

  EventLogging.LogEvent(neworigin, message, EventLogEntryType.Error, 9999);

  EmailMessage(neworigin, message, EventLogEntryType.Error);
}

我究竟做错了什么?我没有收到任何错误,但话又说回来,我没有收到任何日志。

谢谢!

4

3 回答 3

5

new Task(action);创建一个新任务,但它不做任何会导致它实际执行的事情。

在这种情况下,您可能只使用:

Task.Factory.StartNew( () => { /* code goes here */ });

值得一提的是,如果您的代码特别短,那么创建/调度任务的开销可能比实际直接运行它要慢(这当然取决于该代码是什么)。还要确保在多线程环境中记录事件时,您的错误记录能够正常工作。如果没有,您可以决定不打扰,或者添加显式锁定。

于 2012-08-15T16:59:25.923 回答
1

替换new Task(action);Task.Factory.StartNew(action);在单独的线程上开始执行。

于 2012-08-15T17:01:05.350 回答
-1

像这样重写你的动作定义:

Action action = new Action(delegate {
    logException(message, ex);
});

然后创建一个以操作为参数的新任务:

Task myTask = new Task(action);

现在你可以开始任务了:

myTask.Start()

您也可以通过调用它的Invoke方法直接执行该操作:

action.Invoke()
于 2017-08-09T23:35:07.223 回答