ここには 2 つの可能性のあるオプションがあります。
「他のクラス」は、作業が「完了」するとすぐにテキストボックスを更新する必要があります。この場合、フォーム、テキストボックス、インターフェイスなど、何も知らないはずです。値を返すだけで、フォームがその戻り値を使用してテキストボックスを設定したり、何でもできるようにする必要があります。
ほとんどの状況では、これがやりたいことであり、この種の問題を解決するための最も簡単で効果的な手段です。必要がない場合は、より複雑なものを使用しないでください。
タスクが「完了」したときに情報が発生せず、代わりに定期的な間隔で発生する場合は、インターフェイスでProgress
クラスを使用できます。IProgress
インスタンスをForm
作成します: Progress<string> progress = new Progress<string>();
. そのインスタンスのイベント ハンドラーをフォームに添付します。インスタンスは現在の同期コンテキストを「キャプチャ」することに注意してくださいProgress
。これは、UI スレッドで実行されることを巧妙に表現したものです。これは次のように実行できます。
progress.ProgressChanged += (_, data) => textBox1.Text = data;
次に、他のクラスにインスタンスを受け入れIProgress<string>
させ、定期的に呼び出します。
progress.Report(someString);
Progress
およびの 4.5 より前の実装が必要な場合IProgress
は、.NET 3.5+ でコンパイルおよび実行される実装を次に示します。
public interface IProgress<T>
{
void Report(T data);
}
public class Progress<T> : IProgress<T>
{
SynchronizationContext context;
public Progress()
{
context = SynchronizationContext.Current
?? new SynchronizationContext();
}
public Progress(Action<T> action)
: this()
{
ProgressReported += action;
}
public event Action<T> ProgressReported;
void IProgress<T>.Report(T data)
{
var action = ProgressReported;
if (action != null)
{
context.Post(arg => action((T)arg), data);
}
}
}