Multithreading 线程的奇怪行为
我正在编写一个应用程序,它使用MODBUS协议与某些硬件进行通信。Multithreading 线程的奇怪行为,multithreading,invoke,invokerequired,Multithreading,Invoke,Invokerequired,我正在编写一个应用程序,它使用MODBUS协议与某些硬件进行通信。 我使用的是来自代码项目的示例 在尝试优化代码(主要是PollFunction函数)时,我遇到了一个非常奇怪的线程锁 我不是将每行字符串发送到DoGUIUpdatedelagate,而是构建一个字符串数组并将其作为一个整体发送 这样做会导致应用程序崩溃,出现System.Reflection.targetParametercountException:参数计数不匹配错误 原代码: public delegate void GUIU
我使用的是来自代码项目的示例 在尝试优化代码(主要是
PollFunction
函数)时,我遇到了一个非常奇怪的线程锁
我不是将每行字符串发送到DoGUIUpdate
delagate,而是构建一个字符串数组并将其作为一个整体发送
这样做会导致应用程序崩溃,出现System.Reflection.targetParametercountException:参数计数不匹配
错误
原代码:
public delegate void GUIUpdate(string paramString);
public void DoGUIUpdate(string paramString)
{
if (InvokeRequired)
BeginInvoke(new GUIUpdate(DoGUIUpdate), paramString);
else
lstRegisterValues.Items.Add(paramString);
}
private void PollFunction()
{
...
string itemString;
for (int i = 0; i < pollLength; i++)
{
itemString = "[" + Convert.ToString(pollStart + i + 40001) + "] , MB[" + Convert.ToString(pollStart + i) + "] = " + values[i];
DoGUIUpdate(itemString);
}
}
public委托无效GUIUpdate(string-paramString);
公共void DoGUIUpdate(字符串paramString)
{
如果(需要调用)
BeginInvoke(新GUI更新(DoGUIUpdate),参数字符串);
其他的
lstRegisterValues.Items.Add(paramString);
}
私有函数()
{
...
字符串项字符串;
for(int i=0;i
我的代码:
public delegate void GUIUpdate2(string[] paramString);
public void DoGUIUpdate2(string[] paramString)
{
if (InvokeRequired)
BeginInvoke(new GUIUpdate2(DoGUIUpdate2), paramString);
else
{
lstRegisterValues.Items.Clear();
lstRegisterValues.Items.AddRange(paramString);
}
}
string[] valuesStrings;
private void PollFunction()
{
...
valuesStrings = new string[pollLength];
for (int i = 0; i < pollLength; i++)
{
valuesStrings[i] = "[" + Convert.ToString(pollStart + i + 40001) + "] , MB[" + Convert.ToString(pollStart + i) + "] = " + values[i];
}
DoGUIUpdate2(valuesStrings);
}
public委托void GUIUpdate2(string[]paramString);
public void DoGUIUpdate2(字符串[]paramString)
{
如果(需要调用)
BeginInvoke(新的GUIUpdate2(DoGUIUpdate2),paramString);
其他的
{
lstRegisterValues.Items.Clear();
lstRegisterValues.Items.AddRange(paramString);
}
}
字符串[]值字符串;
私有函数()
{
...
ValuesString=新字符串[pollLength];
for(int i=0;i
欢迎任何建议。我认为BeginInvoke(新的GUIUpdate2(DoGUIUpdate2),paramString)代码>是问题所在
“begininvoke”的第二个参数接受一个param对象[]params
,这将导致调用DoGuiUpdate(string1、string2、string3)
,这不是您想要的
尝试用以下方式封装:
BeginInvoke(new GUIUpdate2(DoGUIUpdate2), new[]{ paramString });