我有一个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))
答案 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