Multithreading 从其他类访问windows窗体控件时出现跨线程问题

Multithreading 从其他类访问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,

我正在从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, 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(…)
方法中。