c#:调用方法

时间:2017-07-06 09:26:28

标签: c# winforms invoke begininvoke

我正在使用以下函数plot()在google maps上绘制数据。现在当我从另一个按钮点击事件调用相同的函数时,它没有被执行而是进入else() statement.my情节函数如下:

 public void plot(double temp_lat, double temp_long, string temp_date, string temp_time, string temp_bty_value)
 {
        if (this.InvokeRequired)
        {
            // do something
        } 
        else { this.Close(); }
 }

我从按钮点击事件中调用此函数,如下所示:

private void button6_Click_1(object sender, EventArgs e) /// refresh button
{
      this.Invoke((MethodInvoker)(() => 
                   { 
                        plot(28.5231445, 77.40388525, "17/06/20", "17:00:50", "82"); 
                   }));
}

这是什么原因?我是新手来调用methods.please帮助 编辑:https://stackoverflow.com/a/43797637/6412780之所以我使用调用,是因为我正在不同的线程同时在gmap上绘制5个标记。对synchronization我正在使用调用方法。现在我想更新我的数据。我做了一个刷新按钮,其中包含新的lat / long(在这里手动传递)以在map.being在同一个UI上直接调用plot()函数,但即使这样我也无法执行{ {1}}。这就是我在做的事。

2 个答案:

答案 0 :(得分:0)

在WinForms中,所有 1 UI操作 - 访问任何控件实例的任何成员的任何操作 - 都需要在执行UI操作的单个线程上执行。

非UI线程可以使用

Invoke来使UI线程执行代码(BeginInvoke可以同时执行代码)。

但是,当UI触发时,控件的事件处理程序将始终在UI线程上运行。所以不需要切换线程。要在不同的线程上运行代码(例如,它会阻止UI线程),现在有各种选项,使用async / await,让运行时将其解决,是首选。

在问题的代码中,事件处理程序已经在使用Invoke这是没有意义的:它已经在UI线程上了。

1 在此处简化,实际规则对于高级用例具有细微之处。

答案 1 :(得分:0)

如果您尝试访问来自另一个Thread的{​​{1}}个独占的元素,则需要调用。从后台线程访问GUI元素时非常常见。这是一个例子:

Thread

Thread t = new Thread(() => plot(28.5231445, 77.40388525, "17/06/20", "17:00:50", "82")); public void plot(double temp_lat, double temp_long, string temp_date, string temp_time, string temp_bty_value) { if (this.InvokeRequired) { this.Invoke((MethodInvoker)(() => { this.Close(); })); } else { this.Close(); } } 似乎是this。如果您从另一个Form调用Close方法,则很可能会获得Thread(有很多方法可以阻止这种情况,但这不是一种好的风格)。您需要调用该方法(让Exception决定何时准备好执行命令)