我正在使用以下函数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}}。这就是我在做的事。
答案 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
决定何时准备好执行命令)