短い答え:できません。これらのコンポーネントは、UIスレッドのみでアクセスできます。しかし、関数呼び出しをUIスレッドにディスパッチする方法があります。
ほとんどのUIフレームワークは完全にシングルスレッドです。 uiスレッドとは別のスレッドからコンポーネントにアクセスすることはできません。
現在のUIスレッドにディスパッチする必要があります。コントロール名で見ると、winformsやWPFアプリケーションのように見えます。あなたが戻ってUIスレッドに派遣するために、次のコードを必要とするのWinFormsで
:WPFで
public void UpdateUI(object parameter)
{
if (this.InvokeRequired)
{
Dispatcher.BeginInvoke(new Action(() => UpdateUI(parameter)));
return;
}
// Update or access here
}
次スニップあなたが別のスレッドを形成するUIを変更することができます:
public void UpdateUI(object parameter)
{
if (!Dispatcher.CheckAccess())
{
Dispatcher.BeginInvoke(new Action(() => UpdateUI(parameter)));
return;
}
// Do update or access here
}
ここで注意すべき重要なことは、これらの関数がUIスレッドで実行され、呼び出しスレッドでは実行されないことです。
編集:オブジェクトパラメータは完全にオプションです。これは、パラメータを持つ関数でこのメソッドを使用する方法の例として意図されています。
'Form.BeginInvoke'が役立つ可能性がありますhttps://msdn.microsoft.com/en-us/library/system.windows.forms.form.begininvoke(v=vs.110).aspx – NibblyPig
実行しないでください他のUIスレッド上でUIコントロールを「操作」する関数です。代わりに、他のスレッドで必要な計算を実行します - 計算されたデータを返し、正しい環境でUIコントロールを更新してください。 – Fabio
「Fabio」と同じです。 '' NibblyPig's''コメントはあなたのためのものですが、あなたの "idea"が何か他のものであれば、別の選択肢があるかもしれません。 –