1

私は基本的に2つの仕事をするアプリケーションを持っています:

a)XML(多数のコンテンツ)を解析し、クラスオブジェクトにシリアライズ/デシリアライズし、取得したデータに対していくつかの数学演算を実行します

b) 多数のファイル/ディレクトリを解析して UI を設定します。

どちらも独立したタスクです。ここでは実行時間が長いため、別のクラス (XML の解析と操作を行う) のコンストラクターを呼び出すフォームでマルチスレッドを使用したいと考えています。その方法を教えてください。

public partial class Form1: Form
{
public Binarylist bList = new Binarylist(); //parses the XML and does multiple operations
........
.......
private Form1_Load(object sender, EventArgs e)
{
........ //populates UI by parsing files & directories
}

ここで私の質問 - メインスレッドで form1_load も並行して実行できるように、Binarylist コンストラクターをマルチスレッド化するにはどうすればよいですか?

4

3 に答える 3

3

バックグラウンドワーカーを使用します。

構築されたリストを Completed イベントに渡し、それを formclass フィールドに割り当てます。

必要に応じて、フォームの残りの部分がチェックされていることを確認してくださいbList == null

于 2012-10-07T19:56:19.053 に答える
2

次の手順に従って、バックグラウンド スレッドで BinaryList を生成できます。

  1. BinaryList コンストラクターを呼び出すメソッドを作成する

    private void getBinaryList()
    {
    bList = new BinaryList();
    } 
    
  2. フォームの読み込みが開始されたら、他の処理を行う前に新しいスレッドの実行を開始します。

    private Form_Load(object sender, EventArgs e)
    {
    Thread t = new Thread(new ThreadStart(getBinaryList));
    t.Start();
    
    
    // do your stuff
    
    t.Join();
    //this ensures both threads complete before event execution finishes
    }
    

これらのジョブの両方に時間がかかる場合は、UI スレッドをロックしないことをお勧めします。アプリが応答しなくなるため、両方をバックグラウンド スレッドで実行し、後で UI を更新します。

于 2012-10-07T20:24:58.163 に答える
1

最も簡単な解決策は、タスクを使用することです。

public partial class Form1: Form
{
    private readonly Task<Binarylist> bList = 
        Task.Factory.StartNew(() => new Binarylist());

    private Form1_Load(object sender, EventArgs e)
    {
        // Get the result of the task when needed
        var constructedList = bList.Result;

        // ...
    }
}

アクセスTask.Resultすると、構築が完了するのを待ってから、完全に構築されたオブジェクトが提供されます。間違いなく、Binarylistクラスはタスクを使用してコストのかかる初期化を行うことができます。

于 2012-10-08T06:22:01.143 に答える