2012-08-15 66 views
1

我需要爲我的應用程序創建一個單獨的線程來記錄一些事情,並建議我使用任務。在任務中使用操作 - 不知道它是如何工作的

我似乎沒有這個權利,因爲我沒有完全理解任務(我猜)。

以下是我有:

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); 
} 

我在做什麼錯?我沒有得到任何錯誤,但再次,我沒有得到任何日誌。

謝謝!

回答

5

new Task(action);創建一個新的任務,但它不會做任何會導致它被實際執行的任務。

在這種情況下,你可能只需要使用:

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

值得一提的是,如果你的代碼是特別短則創建的開銷/調度任務可能會比實際直接運行它慢(這當然取決於代碼是什麼)。還要確保在多線程環境中記錄事件時,錯誤日誌記錄將正常工作。如果不是,你可以決定不打擾,或者添加明確的鎖定。

+0

太棒了!那工作。另外,關於開銷的提及,事件日誌和/或電子郵件是不是更多的開銷?我怎麼會知道?謝謝您的幫助! – ErocM 2012-08-15 17:21:45

+0

@ErocM好吧,我知道LogEvent方法只是將字符串存儲在一個列表中,或者它創建它自己的線程來在後臺執行日誌記錄。此外,如果它只是寫一個文件,感謝緩衝/緩存/等。這並不總是那麼緩慢。要真正知道,你會想要淘汰你可信賴的'StopWatch',看看哪些花費更長的時間(平均來說,需要大量的迭代)才能運行。 – Servy 2012-08-15 17:40:22

+0

這就是我所做的。再次感謝您的幫助! – ErocM 2012-08-15 17:58:19

1

new Task(action);替換爲Task.Factory.StartNew(action);以開始在單獨線程上執行。

+0

感謝您的幫助! – ErocM 2012-08-15 17:22:19

-1

重寫你的操作定義是這樣的:

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

然後創建一個新的任務與行動參數:

Task myTask = new Task(action); 

現在可以開始任務:

myTask.Start() 

您也可以通過調用Invoke方法直接執行該操作:

action.Invoke() 
+0

這效率較低,所以除非另有要求,Task.StartNew方法通常應該用於簡單任務。閱讀:https://blogs.msdn.microsoft.com/pfxteam/2010/06/13/task-factory-startnew-vs-new-task-start/ – Milney 2017-08-11 11:29:39

相關問題