0

作業が必要なファイル(ウィジェット)のリストがあります。インターフェイスの応答性を維持できるように、非同期で実行したいと思います。進捗状況に応じてUIを更新したい。これが私のプロトタイプコードです。どうすればこれを達成できますか?スレッドを利用する必要があると思いますが、すべてのスレッドを同時にスパンしたくないので、1つずつ問題ありません。

void Process()
{
    var documents = GetDocuments();
    foreach(document in documents)
    {
        ProcessDocument(
        document,
        status => this.TextBox.Text += status); 
    }
}

void ProcessDocument(Document document, Action<string> onCompleted)
{
}
4

4 に答える 4

1

BackgroundWorkerクラスを使用して、Windowsフォームプロジェクトで非同期操作を処理できます。

BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += (sender, args) => {
    var documents = GetDocuments();
    foreach(var document in documents)
    {
        ProcessDocument(document);
        worker.ReportProgress(0, status);
    }
};
worker.ProgressChanged += (sender, args) => {
    this.TextBox.Text += args.UserState.ToString();
};
worker.RunWorkerAsync();
于 2012-11-13T23:04:35.313 に答える
1

System.Threading.Threadクラスを使用できます

UIのコントロールを安全に更新するには、デリゲートを使用する必要があることに注意してください。メインUIスレッド以外で実行している場合は、コントロールを変更できません。

あなたがそれを制御できると思うので、委任なしでそれを簡単にしたいなら、あなたはプロパティを設定することができます

Control.CheckForIllegalCrossThreadCalls=false

したがって、不正なクロススレッドチェックなしでコントロールを更新することが許可されます

BackgroundWorkerクラスを使用する場合は、これにより、UIを更新できるProgressChangedというイベントをバインドできます。

public void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
     //thread work
    }

    // This event handler updates the UI
    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        // Update the UI here

    }
于 2012-11-13T23:08:20.763 に答える
0

特に、ReactiveExtensionsも検討してIObservable<T>ください。

于 2012-11-13T23:14:49.973 に答える
0

Framework 4.5では、非同期.NETプログラミングを簡素化するasync/awaitキーワードが導入されました。

Framework 4を使用している場合は、TPLをご覧ください。

一方、以前のバージョンの.NET(3.5以前)を使用している場合は、APMを確認する必要があります。

于 2012-11-13T23:39:36.543 に答える