.NET Bug - Threading.Timer影响Parallel.For性能

时间:2010-11-03 20:24:20

标签: .net multithreading timer

我有一个VB.NET WinForms应用程序,它使用顺序的Parallel.For语句。

添加Threading.Timer后,Parallel.For循环缓慢爬行,内核时间量增加到接近80%。

这两个在我的代码中没有关系(即两者都不是由另一个运行),也不共享任何代码或数据。

删除计时器可以解决问题。

还有其他人遇到过这种行为吗?解决此问题的最佳方法是什么(宁愿不创建WinForms Timer但是如果必须的话)?

这是Timer执行的代码:

Public Sub Tick()
  IO.File.WriteAllText("c:\test.txt", DateTime.Now.ToString())
End Sub

这是计时器创建声明:

tmrFile = New Threading.Timer(AddressOf Tick, Nothing, New TimeSpan(0, 0, 0), New TimeSpan(0, 1, 0))

2 个答案:

答案 0 :(得分:1)

您的计时器是否经常发出信号?如果是这样,您可能会对从计时器触发的线程数量感到不知所措。有一定数量的线程可以运行,如果Timer过于频繁地发出信号,那么代码的其余部分将会受到影响。

你能分析一下你的计时器在做什么并分享这些信息吗?它是否经常发出信号,它正在执行的任何特别粗略的代码,如果它也在执行并行任务等等。

答案 1 :(得分:0)

尝试将其从线程池中删除!我把一个简单的计时器类放在一起试试(不是生产代码,请注意)。这个类在一个单独的线程中运行。

班级:

  public class ThreadedTimer : IDisposable
  {
     private readonly AutoResetEvent _isStopping = new AutoResetEvent(false);
     public ThreadedTimer(Action f, int interval)
     {
        Thread t = new Thread(() =>
        {
           while (!_isStopping.WaitOne(interval))
           {
              f();
           }
        });
        t.IsBackground = true;
        t.Start();
     }

     public void Dispose()
     {
        _isStopping.Set();
     }
  }

启动计时器:

var timer = new ThreadedTimer(() => Debug.WriteLine("Test"), 1000);

<强>更新 VB中完全未经测试的代码

Imports System.Threading
Public Class ThreadedTimer
    Implements IDisposable
    Private ReadOnly _isStopping As New AutoResetEvent(False)

    Public Sub New(ByVal f As Action, ByVal interval As Integer)
        Dim t As New Thread(Sub()
                                While Not _isStopping.WaitOne(interval)
                                    f()
                                End While
                            End Sub)
        t.IsBackground = True
        t.Start()
    End Sub

    Public Overloads Sub Dispose() Implements IDisposable.Dispose
        _isStopping.[Set]()
    End Sub
End Class