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”