小编use*_*586的帖子

C#SynchronizingObject和Timer.Timer线程

嗨,我试图在我的主线程上触发Timer.Timer类的Elapsed事件。我仅限于VS 2008,.net 3.5 ...在本文中: C#计时器是否在单独的线程上运行了? 声明使用SynchronizingObject将使处理程序在拥有该对象的线程上执行。

所以我尝试了这个:

class MyTimer
{
  private readonly Timer timer;

  public MyTimer(ISynchronizeInvoke synchronizingObject)
  {
    Console.Out.WriteLine(Thread.CurrentThread.ManagedThreadId);
    timer = new Timer(1000);
    timer.SynchronizingObject = synchronizingObject;
    timer.Elapsed +=
      delegate
        {
          timer.Stop();
          Thread.Sleep(2000);
          Console.Out.WriteLine(Thread.CurrentThread.ManagedThreadId);
          timer.Start();

        };
    timer.Start();
  }
}

class Program
{
  static void Main(string[] args)
  {
    ISynchronizeInvoke syncObject = new Control();
    var mytimer = new MyTimer(syncObject);

    Console.ReadKey();
  }
}
Run Code Online (Sandbox Code Playgroud)

但是输出是:1,4,4,4,4 ...

这是为什么?如何使Elapsed处理程序在主线程上执行。

我尝试将SynchronizingObject用于事件, 但这也无济于事:

  public static ElapsedEventHandler Wrap(ElapsedEventHandler original, ISynchronizeInvoke synchronizingObject) 
  {
    return (sender, args) =>
    {
      if (synchronizingObject.InvokeRequired) …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading deadlock timer

5
推荐指数
1
解决办法
9325
查看次数

标签 统计

.net ×1

c# ×1

deadlock ×1

multithreading ×1

timer ×1