Mak*_*kah 2 c# multithreading timer handler
我正试图处理这个Timer例外.如果类有类似的东西HandlerExceptionEvent我们可以添加一些事件来记录某些东西或停止计时器,那将是很好的.
PS:我不想在里面添加一个try/ catchblock ElapsedEventHandler().
class Program
{
static void Main(string[] args) {
System.Timers.Timer t = new System.Timers.Timer(1000);
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
t.Start();
System.Threading.Thread.Sleep(10000);
t.Stop();
Console.WriteLine("\nDone.");
Console.ReadLine();
}
static void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
Console.WriteLine("Ping!");
throw new Exception("Error!");
}
}
Run Code Online (Sandbox Code Playgroud)
Joh*_*ren 11
PS:我不想在ElapsedEventHandler()中添加"try/catch Exception"
由于Timer类不支持这样的事件,否则你怎么会捕获异常呢?
如果你坚持使用Timer类,那么这可能是你唯一的选择:
var t = new System.Timers.Timer(1000);
t.Elapsed += (sender, e) => {
try
{
t_Elapsed(sender, e);
}
catch (Exception ex)
{
// Error handling here...
}
};
Run Code Online (Sandbox Code Playgroud)
这样,实际的处理程序t_Elapsed不包含任何错误处理,您可以为Timer类创建一个包装类,它隐藏了这个实现细节,并为异常处理提供了一个事件.
这是一种方法:
class ExceptionHandlingTimer
{
public event Action<Exception> Error;
System.Timers.Timer t;
public ExceptionHandlingTimer(double interval)
{
t = new System.Timers.Timer(interval);
}
public void Start()
{
t.Start();
}
public void AddElapsedEventHandler(ElapsedEventHandler handler)
{
t.Elapsed += (sender, e) =>
{
try
{
handler(sender, e);
}
catch (Exception ex)
{
if (Error != null)
{
Error(ex);
}
else
{
throw;
}
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5714 次 |
| 最近记录: |