C#2005 以降、インターフェイス コントロールへのマルチスレッドの直接アクセスはサポートされなくなりました (インターフェイス作成スレッドとアクセス スレッドは同じスレッドではありません)。これはデリゲートを使用することで解決できます:
1 デリゲートを宣言します。デリゲート実装関数を定義します
view plaincopy to ClipboardPRint?
delegate void ShowProgressDelegate(int newPos)
{
// アクセスがスレッド内にあるかどうかを判断します
if (!_progressBar.InvokeRequired)
{
// そうでない場合は、直接操作します Control
_progressBar.Value = newPos;
}
else
{
// はいの場合、デリゲート アクセスを有効にします
ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
// Invoke を使用する場合、関数呼び出しが完了するまで待機しますが、BeginInvoke は直接待機しません 戻る
this.BeginInvoke(showProgress, new object[] { newPos });
delegate void ShowProgressDelegate(int newPos);
private void ShowProgress(int newPos)
{
// スレッド内にあるかどうかを判断します
if (!_progressBar.InvokeRequired)
{
// そうでない場合は、コントロールを直接操作します
_progressBar.Value = newPos;
}
else
{
// はいの場合、デリゲート アクセスを有効にします
ShowProgressDelegate showProgress = new ShowProgressDelegate(ShowProgress);
// Invoke を使用する場合、関数呼び出しが終了するまで待機しますが、BeginInvoke は待機せず、すぐに戻ります
this。 BeginInvoke(showProgress, new object[] { newPos });
}
}
2. スレッド関数を定義します (インターフェイス コントロールは別のスレッドで読み取ることができます)
view plaincopy to Clipboardprint?
private void ProgressStart()
{
while (true)
{
int newPos = _progressBar.Value + 10;
if (newPos > _progressBar .Minimum)
{
newPos = _progressBar.Minimum
}
Trace.WriteLine(string.Format("Pos: {0}", newPos));
// メソッドはここで直接呼び出され、有効かどうかは内部で自動的に決定されます デリゲート
ShowProgress(newPos);
Thread.Sleep(100);
}
}
private void ProgressStart()
{
while (true)
{
int newPos = _progressBar.Value + 10;
if (newPos > _progressBar.Minimum)
{
newPos = _progressBar.Minimum;
}
Trace.WriteLine(string. Format("Pos: {0}", newPos));
// メソッドはここで直接呼び出され、デリゲートを有効にするかどうかが内部で自動的に決定されます
ShowProgress(newPos);
Thread.Sleep(100);
}
3. スレッドの起動と終了
クリップボードプリントへのプレーンコピー?
private Thread _progressThread = new Thread(new ThreadStart(ProgressStart ));
// オプション、関数: スレッドが終了しない場合でも、プロセスは実行されます。終了できます
_progressThread.IsBackground = true;
_progressThread.Abort();
// 関数: 続行する前にスレッドが終了するまで待機します
_progressThread = null;
上記は C# マルチスレッド アクセス インターフェイスの内容です。さらに関連する内容については、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。