これは 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;
}
}