c#:调用方法

c#:调用方法,c#,winforms,invoke,begininvoke,C#,Winforms,Invoke,Begininvoke,我正在使用以下函数plot()在谷歌地图上绘制数据。现在,当我从另一个按钮单击事件调用同一函数时,它不会执行,而是进入else()语句。我的绘图函数如下: public void plot(double temp_lat, double temp_long, string temp_date, string temp_time, string temp_bty_value) { if (this.InvokeRequired) { //

我正在使用以下函数
plot()
在谷歌地图上绘制数据。现在,当我从另一个按钮单击事件调用同一函数时,它不会执行,而是进入
else()
语句。我的绘图函数如下:

 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"); 
                   }));
}
我从按钮单击事件调用此函数,如下所示:

 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"); 
                   }));
}
原因是什么时候?我不熟悉调用方法。请帮助 编辑:我之所以使用调用,是因为我在gmap上从不同线程同时绘制了5个标记。因此对于
同步
我使用调用方法。但现在我想更新我的数据。我制作了一个刷新按钮,其中包含新的lat/long(在这里手动传递)来在地图上绘图。在同一个UI上,我直接调用了
plot()
函数,但即使这样,我也无法执行
if语句。这就是我正在做的。

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

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

但当UI触发时,控件的事件处理程序将始终在UI线程上运行。所以不需要切换线程。要在不同的线程上运行代码(例如,它会阻塞UI线程),有多种选择,现在最好使用
async
/
wait
,让运行时计算出来

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


1简化这里,对于高级用例,实际规则具有微妙之处。

如果您试图访问元素,则需要调用,这些元素是一个
线程
从另一个
线程
独占的。从后台线程访问GUI元素时,这种情况非常常见。以下是一个例子:

    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(); 
        }
     }

似乎是一个
表单
。如果从另一个
线程
调用
Close
方法,您很可能会得到一个
异常
(有一些方法可以防止这种情况,但这不是好的样式)。您需要调用该方法(让
表单决定何时可以执行命令)

这里没有调用的理由。您已经在
按钮6中调用了
调用
,因此在UI线程中调用了
plot
,因此
invokererequired
将返回false。现在还不清楚这有什么奇怪的地方。这里invokererequired并不意味着必须调用
plot
方法,而是如果必须将调用分派到UI线程,那么您想要解决的实际问题是什么?当您已经在UI线程上时,没有理由使用
Invoke()
。您是否遇到了不同的问题并试图“简化”代码?您是否尝试在后台运行某些东西,并以错误的方式根据结果更新UI?Invoke的问题似乎源于总体设计中错误的编码选择。在名为“plot”的函数中不应有“if”。为什么有人希望表单在调用“plot”时关闭??“如果”应该在更合理的地方执行(不能告诉您代码片段中的位置)&plot应该留给“plot”