テキストボックス付きの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どこかにすべきですか?どこで間違いを犯しているのですか?