Multithreading 从其他类访问windows窗体控件时出现跨线程问题
我正在从windows窗体执行SSIS包。在表单的一个按钮点击中,我正在执行SSIS包并实例化PackageEventListener,传递“this”,即表单1Multithreading 从其他类访问windows窗体控件时出现跨线程问题,multithreading,winforms,ssis,Multithreading,Winforms,Ssis,我正在从windows窗体执行SSIS包。在表单的一个按钮点击中,我正在执行SSIS包并实例化PackageEventListener,传递“this”,即表单1 var app = new SSISApplication(); _pkg = app.LoadPackage(pkgLocation, null); var listener = new PackageEventListener(this); DTSExecResult pkgResults = _pkg.Execute(null,
var app = new SSISApplication();
_pkg = app.LoadPackage(pkgLocation, null);
var listener = new PackageEventListener(this);
DTSExecResult pkgResults = _pkg.Execute(null, null, listener, null, null);
我还重写DefaultEvents以从PackageEventListener.cs类中的包中获取进度。在构造函数中,我获取Form1并使用它来获取设置lblExportStatus标签的公共方法
public class PackageEventListener : DefaultEvents
{
private Form1 formInstance;
public PackageEventListener(Form1 form)
{
formInstance = form;
}
public override void OnProgress(TaskHost taskHost, string progressDescription, int percentComplete, int progressCountLow,int progressCountHigh, string subComponent, ref bool fireAgain)
{
var message = string.Format("{0}:{1}", percentComplete, progressDescription);
formInstance.SetMsg(message);
base.OnProgress(taskHost, progressDescription, percentComplete, progressCountLow, progressCountHigh, subComponent, ref fireAgain);
}
}
我想用OnProgress方法的消息更新windows窗体中的标签
我在windows窗体内创建了一个public方法,以如下方式设置标签:
public void SetMsg(string msg)
{
if (lblExportStatus.InvokeRequired)
lblExportStatus.Invoke(new System.Action(() => lblExportStatus.Text = msg));
else
lblExportStatus.Text = msg;
}
我收到此错误:线程“”(0x3930)已退出,代码为0(0x0)
lblExportStatus从未在SetMsg方法中被赋值。invokererequired始终为true。并引发异常“出现异常”Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessaginException”
请帮助解决这个问题。提前谢谢你 您收到的消息表示线程已成功完成。“线程“”(0x3930)已退出,代码为0(0x0)”不是错误。如果你认为是,请发布堆栈跟踪。这是调用简单操作的一种非常迂回的方式。只需调用
lblExportStatus.Invoke(新操作(()=>lblExportStatus.Text=msg))
在SetMsg(…)
方法中。