4

これは非常に一般的な質問かもしれませんが、私は C# を初めて使用します。これを説明するか、例または説明への適切なリンクを教えてください。

C# Winform アプリケーションを設計したいと考えています。アプリケーションには、必要に応じてユーザー入力を収集するメイン フォームがあります。UI とともに、複雑で長時間実行される計算アルゴリズムが開発されます。計算の開始は、メイン フォームのボタンからトリガーされます。(CaculateClass.Start())

質問 1: CaculateClass のメソッド コール スタックのある時点で、CaculateClass は、計算を続行するためにユーザーからの追加入力が必要であることを検出します。

古代の C++ コンソール アプリケーションの時代では、次のようなことをしていたでしょう: cout << "Ask question"; cin >>答え;

C# で winforms を使用してこれを行うには、コール スタックのどこか深いところから UI に制御を渡し、入力を取得して、計算が中断された場所に戻りますか? それとも、CaculateClass をまったく別の方法で設計する必要がありますか?

質問 2 UI のフリーズを回避するために、多くの記事では、このような長時間実行される計算を別のスレッドに配置することを推奨しています。たとえば、BackgroundWorker() を使用します。

CaculateClass.Start() を BackgroundWorker で計算させた場合 -> ユーザー入力の収集はどのように機能しますか?

助けてくれてありがとう、CS

4

2 に答える 2

4

C# で winforms を使用してこれを行うには、コール スタックのどこか深いところから UI に制御を渡し、入力を取得して、計算が中断された場所に戻りますか? それとも、CaculateClass をまったく別の方法で設計する必要がありますか?

おそらく言語固有ではありませんが、物事を切り離したいと思うでしょう。フォームから入力を取得し、委任されたクラスなどで操作します。委任されたクラスの準備が整い、結果を表示できるようになったら、UI を更新します。

質問 2 UI のフリーズを回避するために、多くの記事では、このような長時間実行される計算を別のスレッドに配置することを推奨しています。たとえば、BackgroundWorker() を使用します。

応答性に関しては、はい、バックグラウンド スレッドは問題なく動作します。入力の収集に違いはありません。入力をオブジェクトに渡すだけで、そのオブジェクトが計算を行います。同じスレッドまたは別のスレッドでそれを行うのは、設計上の選択の問題です。違いは、結果をメイン スレッドにポストするときに発生します。メイン スレッド以外の別のスレッドでユーザー コントロールを変更してはならない (できない) ためInvoke、結果をメイン スレッドに戻す必要があります。このトピックの詳細については、MSDN を参照してください。

一般的な質問に対する一般的な発言:)

UI をできるだけ薄く保つようにしてください。物事を視覚化し、ユーザーの入力を得る責任があります。Google for MVC (モデル ビュー コントローラー) - よく知られている GUI デザイン パターン。または、MVVM (モデル ビュー ビュー モデル) を見てください。これは、やや最新の GUI デザイン パターンです。どちらにも、設計を分離した状態に保つための多くのベスト プラクティスと方法があります。

于 2013-04-01T19:20:54.503 に答える
3

Continuation Tasks をご覧ください: http://msdn.microsoft.com/en-us/library/ee372288.aspx

タスクは、バックグラウンド作業を実行するための新しいプログラミング パラダイムであり、BackgroundWorker よりも優先されます。

于 2013-04-01T19:18:44.367 に答える