1

私は ASP.NET Web アプリケーションを何年も書いていますが、大規模な Windows フォーム プロジェクトにはあまり取り組んでいません。私は今、それに取り組む必要があるので、大規模なウィンドウフォームプロジェクトが理想的にどのように構造化されるべきかについてのいくつかの指針を探しています。具体的には、複数のスレッドを処理する方法を知りたいです。完了するまでに時間がかかるプロセスがあるとします。UI ウィンドウがフリーズして応答しなくなるのは望ましくありません。そのため、そのロジックは別のスレッドで移動する必要があります。このスレッドが UI にアクセスすると、例外が発生します。Invoke はうまく機能しているように見えますが、読み書きするのは非常に見苦しく面倒です!

では、実際には、ベストプラクティスは何ですか? どのタイプのスレッドを起動する必要があり、これらのスレッドを UI とロジックの間でどのように分割する必要がありますか? 始めるためのサンプルコードはありますか?

4

3 に答える 3

3

バックグラウンドワーカーを使用する簡単な方法は次のとおりです

        public Form1()
    {
        InitializeComponent();

        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true; //set to true to fire the progress-changed event
        worker.DoWork += doWork;
        worker.ProgressChanged += progressChanged;
    }

    void progressChanged(object sender, ProgressChangedEventArgs e)
    {
        int progress = e.ProgressPercentage; //Progress-Value
        object userState = e.UserState; //can be used to pass values to the progress-changed-event
    }

    void doWork(object sender, DoWorkEventArgs e)
    {
        object argument = e.Argument; //Parameters for the call
        bool cancel = e.Cancel; //Boolean-Value for cancel work
        object result = e.Result; //Object for a return-value
    }
于 2012-06-12T07:18:39.540 に答える
2

UI の応答性を実現し、長時間実行されるタスクを実行し、並列処理を実現する方法はたくさんあります。アプリケーションに適した方法を選択する必要があります -

Jon Skeet によるこの記事は、最初は常におまけです。

  1. アプリケーションの設計と要件に従って、これらのスタイルのいずれかを使用して、同期メソッドを非同期的に呼び出すことができます

  2. 複数のスレッドの作業を調整したり、ブロックするスレッドを処理したりするなど、より困難な状況

  3. 非同期機能をクライアント コードに公開するには、さまざまな方法があります。イベントベースの非同期パターンについては、こちらをお読みください。これは、クラスが非同期動作を提示するための推奨される方法を規定しています。

  4. バックグラウンド ワーカーは、実行時間の長いタスクが 1 つある場合に便利です。

これで有利なスタートが切れることを願っています。

于 2012-06-12T08:46:34.250 に答える
2

別のスレッドを使用するとすぐに、UI に触れるときに UI スレッドに戻る必要があります。

someForm.BeginInvoke()でこれを実行できますが、他にもオプションがあります。

BackgroundWorker が切り替えを行うことができます。

.NET 4.5/C# 5 では、 async/awaitを使用できます。継続は元のスレッドで呼び出されます。

一般に、スレッドを頻繁に切り替える必要がないように、できるだけ UI からロジックを解きほぐしてください。

于 2012-06-12T07:20:38.287 に答える