0

Windows フォームから SSIS パッケージを実行しています。フォームのボタン クリックで、SSIS パッケージを実行し、Form1 である「this」を渡す PackageEventListener をインスタンス化しています。

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 は常に true です。そして、「例外 'Microsoft.VisualStudio.Debugger.Runtime.CrossThreadMessagingException' が発生しました」という例外がスローされます。

この問題を解決してください。前もって感謝します!!

4

0 に答える 0