以下是我正在做的简化版本:
delegate void ValueDelegate(object sender, EventArgs e);
private void ExecFinished(object sender, EventArgs e)
{
if (InvokeRequired)
{
var pp = new ValueDelegate(ExecFinished);
this.Invoke(pp, sender, e);
}
else
{
//do something
}
}
抛出的异常是this.Invoke(pp, sender, e);
此代码在第二个线程上运行,当我尝试访问表单控件时,它会出现以下错误: 跨线程操作无效:控制'control_name'从其创建的线程以外的线程访问。
调试过程中无变量为空。
异常详情:
System.NullReferenceException was unhandled
HResult=-2147467261
Message=Object reference not set to an instance of an object.
Source=System.Windows.Forms
StackTrace:
at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous)
at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)
at SpectrometryAnalysis.TraditionalDataForm.ExecFinished(Object sender, EventArgs e) in D:\...\TraditionalDataForm.cs:line 393
at SpectrometryAnalysis.Model.JavaMachineLearningCaller.<>c__DisplayClass1_0.<Redirect>b__0(Object a) in D:\...\Model\JavaMachineLearningCaller.cs:line 84
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart(Object obj)
InnerException:
有什么想法吗? 谢谢! :)