C# 新线程中的Dispatchermer

C# 新线程中的Dispatchermer,c#,main,dispatchertimer,C#,Main,Dispatchertimer,我正在开发一个c#应用程序。我需要2线;一个是主要的,另一个是通过我的数据库不断寻找信息。 我想使用调度程序计时器作为: dispatcherBd.Tick += (s,e) => CallPoll (s,e); dispatcherBd.Interval = new TimeSpan(0,0,0,100); dispatcherBd.Start(); 如果我在我的主线程中这样做,一切都会很完美,但如果我在新线程中这样做。它不起作用 public Main(){ threadDB

我正在开发一个c#应用程序。我需要2线;一个是主要的,另一个是通过我的数据库不断寻找信息。 我想使用
调度程序计时器
作为:

dispatcherBd.Tick += (s,e) => CallPoll (s,e);
dispatcherBd.Interval = new TimeSpan(0,0,0,100);
dispatcherBd.Start();
如果我在我的主线程中这样做,一切都会很完美,但如果我在新线程中这样做。它不起作用

public Main(){
    threadDB = new Thread(InitDispatcher);
    threadDB.Start();
}

private void InitDispatcher(){
    DispatcherTimer dispatcherBd.Tick += (s,e) => CallPoll (s,e);
    dispatcherBd.Interval = new TimeSpan(0,0,0,100);
    dispatcherBd.Start();
}

有什么问题吗?

正如您在评论中所述,您将
dispatcherBd
声明为
InitDispatcher()
中的局部变量:

因此
dispatcherBd
仅在
InitDispatcher
内的作用域中,并且在该方法离开后将可用于垃圾回收。
当它被垃圾收集并完成时,计时器事件将不再引发

因此,请尝试将
dispatcherBd
改为字段

private DispatcherTimer dispatcherBd;

private void InitDispatcher()
{
    dispatcherBd = new DispatcherTimer();
    // ...

但请注意,
dispatchermer
在UI线程上调用其处理程序。因此,如果
CallPoll
花费大量时间,您的UI将被阻止。
因此,您可能希望从计时器的处理程序启动另一个线程:

dispatcherBd.Tick += (s, e) => { Task.Run(() => CallPoll(s, e)) };
或者使用
System.Threading.Timer
而不是
dispatchermer
。该线程在线程池线程上运行
Tick
事件


在这两种情况下,当您希望在UI上显示结果时,都需要返回UI线程。

除非绝对必要,否则请忘记手动线程。使用
任务。运行
可以在另一个线程上安排(可能的、连续的)作业。不要忘记
Dispatcher。如果需要从新创建的(非UI)线程更新UI,请调用
proxy


<>在事情变得过于复杂的情况下,考虑<代码>反应性扩展< /代码>。有现成的计时器,还有很多很多。

在计时器的嘀嗒声中使用dispatcher.invoke“它不工作”是什么意思?您使用的时间跨度签名是100秒,而不是100毫秒。您的第一个示例也不应该每100毫秒打勾一次。
dispatcherBd
是局部变量还是字段?猜测一下:如果它是一个局部变量,它可能会被垃圾收集,因此计时器会被破坏。dispatcher需要一个dispatcher,您的新线程没有。使用正确的计时器类,System.Timers.timer或System.Threading.timer可以在不使用线程的情况下完成任务。如果“CallPoll”所需时间少于20毫秒,则只需在主线程上使用Dispatchermer。
dispatcherBd.Tick += (s, e) => { Task.Run(() => CallPoll(s, e)) };