【问题标题】:Calling methods in main thread from other threads从其他线程调用主线程中的方法
【发布时间】:2013-06-15 11:18:41
【问题描述】:

我正在尝试在 C# 应用程序中同时运行 3 个级别的计时器 例如:

T1 将在应用程序的开头运行,然后在其 Tick 事件中,T2 将启动 然后在 T2 的滴答事件上,T3 将启动。 最后,在T3的tick事件上,应该在应用的主线程中做点什么

我的问题似乎是主线程中的代码在被其他线程调用时不起作用

我应该怎么做才能让主线程通过来自其他线程的调用来运行它的功能?

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 您要解决的*business问题是什么?
  • C1 类 { 定时器 T1; C2 C2; OnT1Tick() { c2.T2.start() } } C2 类 { 定时器 T2 C3 c3; OnT2Tick() { c3.T3.start } } Class C3 { Timer T3 OnT3Tick() { system.console.write ("something");问题是 system.console.write 是从主线程调用的,每个计时器都在创建一个新线程
  • @user2302005 请编辑您的问题并从 ide 复制/粘贴代码。我在任何地方都看不到new 关键字。你确定连第一个计时器都在触发吗?

标签: c# multithreading timer


【解决方案1】:

问题很可能是您的主线程需要调用。如果您要在调试器中运行程序,您应该会看到跨线程操作异常,但在运行时会禁用此异常检查。

如果你的主线程是一个表单,你可以用这个短代码来处理它:

 if (InvokeRequired)
 {
    this.Invoke(new Action(() => MyFunction()));
    return;
 }

或 .NET 2.0

this.Invoke((MethodInvoker) delegate {MyFunction();});

编辑:对于控制台应用程序,您可以尝试以下操作:

  var mydelegate = new Action<object>(delegate(object param)
  {
    Console.WriteLine(param.ToString());
  });
  mydelegate.Invoke("test");

【讨论】:

  • 实际上,最后,它会是一个unity3D函数,但目前我正在研究类
  • VS 2013/Resharper 8 告诉我我可以将其简化为 this.Invoke(new Action(MyFunction));
  • @VladL 代表的控制台应用程序部分对我不起作用。我在一个类中将该变量定义为静态变量,并从计时器调用它,但线程仍然不是主线程。
  • 请帮忙,确实需要。
  • @DreTaX 提出新问题,不看代码很难帮忙
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多