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

私は何が間違っているのですか?エラーは発生していませんが、ログが発生していません。

ありがとう!

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 に答える