【问题标题】:C# wait for MethodInvoker to finishC# 等待 MethodInvoker 完成
【发布时间】:2014-09-19 15:00:21
【问题描述】:

我需要完成以下场景。 ThreadMethod() 是一个 Timer 方法,我在 Invoke 语句中有 UI 更新。我需要等到 Invoke 完成其工作,然后继续该方法。我该如何应对?

public void ThreadMethod(){
//do some work

            this.Invoke((MethodInvoker)delegate
            {
            //do some GUI update
            });

//wait till Invoke finish its work    
}

【问题讨论】:

  • 它已经这样工作了,只有 BeginInvoke() 不等待。
  • 你已经在等待了。 Invoke 被阻塞并在委托执行后返回。
  • 不等了,我做了一个测试例子:System.Threading.Thread.Sleep(500); Console.Write("1"); this.Invoke((MethodInvoker)delegate { System.Threading.Thread.Sleep(2000); Console.Write("2"); });,输出是112112

标签: c# multithreading timer invoke


【解决方案1】:

你不需要做任何事情。 Invoke(与 BeginInvoke 不同)将阻塞,直到计划的委托完成执行。

【讨论】:

  • 那么为什么这个代码:public void ThreadMethod() { System.Threading.Thread.Sleep(500); Console.Write("1"); this.Invoke((MethodInvoker)delegate { System.Threading.Thread.Sleep(2000); Console.Write("2");}); } output:112112,我期望:121212
  • @user1816806 您刚刚提供的代码将打印12,而不是您刚才提到的任何一项。
  • 我提到它每隔 1 秒就有一个 Time 方法。
  • @user1816806 不,实际上你没有。当然,这使您看到的输出完全合理,因为您同时多次调用此操作(因为运行时间比间隔时间长),这意味着输出几乎可以是任何东西。如果只运行一次,您将看到12,表明Invoke 正在阻塞。
  • 啊好吧,没想到它同时进行,所以我必须将计时器更改为任务并在最后设置睡眠(1000)。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-08-07
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2010-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多