0

これは C# winform .Net Framework 2.0 プロジェクトです。時間のかかるネットワーク転送ジョブは BackupgroundWorker で実行されます。このバックグラウンド スレッドでは、SynchronizationContext メソッドを使用して、現在のジョブ タイトルをメイン UI スレッドのメッセージ ダイアログに送信します。ただし、私のコードでは、スレッド競合の問題が発生し、「NullReferenceException」が発生することがあります(常にではなく、ランダムに)。これが私のコードです:

private void DoBtn_Click(object sender, EventArgs e)
{
    m_msgForm = new MsgForm();       //m_msgForm is a member variable of the class, and MsgForm is a form class with a "public static SynchronizationContext synContext"
    m_msgForm.UpdateMsg("starting ...");   //UpdateMsg is public method to show progress information

BackgroundWorker myBackgroundWorker = new BackgroundWorker();
        myBackgroundWorker.DoWork +=new DoWorkEventHandler(myBackgroundWorker_DoWork);
        myBackgroundWorker.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(myBackgroundWorker_RunWorkerCompleted);
        myBackgroundWorker.RunWorkerAsync(theBackgroundArgument);  

    m_msgForm.ShowDialog();    //show as a modal dialog
 }

また、バックグラウンド ワーカー スレッドでは次のようになります。

private void myBackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
   //... some code
   string msgText ="doing job: " +job.Title;
   RestoreMsgForm.synContext.Send(m_msgForm.UpdateMsg, msgText);    //send message to m_msgForm in the UI thread 

   //... some code
}

問題は、backgroundworker スレッドの "RestoreMsgForm.synContext.Send() が、UI スレッドの m_msgForm.ShowDialog() の前に実行されることがあります。この場合、NullReferenceException がスローされます。

この問題を解決するには?ありがとう。

RestoreMsgForm の定義は

  public partial class RestoreMsgForm : Form
    {
        public static SynchronizationContext synContext;
        public RestoreMsgForm()
        {
            InitializeComponent();
        }
        private void RestoreMsgForm_Load(object sender, EventArgs e)
        {
            synContext = SynchronizationContext.Current;
        }
        public void UpdateMsg(object msg)
        {
            msgLabel.Text = (string)msg;
        }
}
4

1 に答える 1