Я создал обработчик события Timer согласно приведенному ниже коду в объекте класса .:
public class MyTimerClass
{
private Timer _timeoutTimer;
private void Constructor()
{
_timeoutTimer = new Timer(TimerHandler, null, 0, 1000);
}
private void TimerHandler()
{
if (Something)
LogMessage(LogLevel.Error, "Timeout Waiting...");
}
}
Я создал событие LogMessageHandler с делегатом в том же объекте класса для обработки события таймера и других событий журнала:
public delegate void LogMessageHandler(LogLevel logLevel, string message);
public event LogMessageHandler OnLogMessage;
private void LogMessage(LogLevel logLevel, string message)
{
if (OnLogMessage != null)
OnLogMessage(logLevel, message);
}
В другом классе я хотел бы обработать сообщение журнала, полученное для таймера.Вот моя подписка на событие OnLogMessage и класс, который обрабатывает поток:
void InitializeMyTimerClass()
{
try
{
_myTimerClass = new MyTimerClass();
_myTimerClass.OnLogMessage += new LogMessageHandler(UpdateLogMessage);
}
catch (Exception ex)
{
_dialog.ShowException(ex.Message);
}
}
private void UpdateLogMessage(LogLevel newLogLevel, string message)
{
TaskScheduler schedulerForLog = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() => TrackResponseMessage.Add(FormatLogLevelToString(newLogLevel) + ": " + message),
CancellationToken.None, TaskCreationOptions.None, schedulerForLog);
}
Когда я запускаю код и происходит событие таймера, я ставлю точку останова, где создается TaskScheduler: TaskScheduler schedulerForLog =TaskScheduler.FromCurrentSynchronizationContext ();Параметры LogLevel и string успешно передаются из MyTimerClass.Тем не менее, я получаю InvalidOperationException, когда TaskScheduler пытается получить текущий контекст синхронизации.Похоже, что SynchronizationContext из потока таймера неприемлемо для TaskScheduler.
Вопрос. Передается ли событие таймера в отдельном потоке?Каков наилучший способ обработки потока таймера в этом случае?Может кто-нибудь предоставить демо-код?... Спасибо!