テキストボックス付きのWindowsフォームがありますtxtOutput
。内容があります。txtOutput.Text
同じスレッド内から、および次のようにスレッド間で両方を取得および設定するためのプロパティを作成しました。
public string OutputString
{
get
{
string text = string.Empty;
if (txtOutput.InvokeRequired)
{
txtOutput.BeginInvoke(new MethodInvoker(delegate
{
text = txtOutput.Text;
}));
}
else
{
text = txtOutput.Text;
}
return text;
}
set
{
if (txtOutput.InvokeRequired)
{
txtOutput.BeginInvoke(new MethodInvoker(delegate
{
txtOutput.Text = value;
}));
}
else
{
txtOutput.Text = value;
}
}
}
同じスレッドからプロパティを設定/取得した場合、次のような関数を呼び出したときの動作は期待どおりPrintMessage()
です。
public void PrintMessage()
{
MessageBox.Show(OutputString);
}
しかし、私がこのように呼ぶときnew Thread(PrintMessage).Start()
。はテキストボックスのget
値を取得しません(つまり、MessageBox
は空の文字列を表示します)。行にブレークポイントを保持して同じことを行うと、次のようになります。
txtOutput.BeginInvoke(new MethodInvoker(delegate
{
text = txtOutput.Text;
}));
デバッグ中に、値が取得されます(つまり、がコンテンツMessageBox
を表示しtxtOutput
ます)
私はsleep
どこかにすべきですか?どこで間違いを犯しているのですか?