我正在从 Windows 窗体执行 SSIS 包。在表单的按钮单击中,我正在执行 SSIS 包并实例化 PackageEventListener 传递“this”,即 Form1。
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 void SetMsg(string msg)
{
if (lblExportStatus.InvokeRequired)
lblExportStatus.Invoke(new System.Action(() => lblExportStatus.Text = msg));
else
lblExportStatus.Text = msg;
}
我收到此错误:线程 '' (0x3930) 已退出,代码为 0 (0x0)。
lblExportStatus 永远不会被赋值为 SetMsg 方法中的值。InvokeRequired 始终为真。并引发异常“发生异常'Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException'”。
请帮助解决这个问题。先感谢您!!