2016-11-06 14 views
1

私はdatagridviewを持っており、データソースをロードするのに時間がかかります。私はそれのための読み込みをしたいとバックグラウンドワーカーと非同期awaitとtask.factory.startnewとtask.runを試してみました...しかし、datagridviewは、私の読み込みのGIFを凍結されます充填されます。ガードビューがいっぱいになるとロードがフリーズします

どうすればよいですか?

私は多くのグーグルグーグルで、テキストを見ました。彼らは私たちがただ一つのUIスレッドを持っていると言いました。 私はこのような状況のような多くのポストを見てきました。私は5日間それらを試しましたが失敗しました。多分私は見ることができない明確なことがあります。

例えば、それはGIFをロードしているとリッチテキストボックスが充填されている状況のようなものです: 我々は

private void button1_Click (object sender, EventArgs e) 
    { 

    Task.Factory.StartNew(()=>; 
    { 
     huge(); 
    } 
     ); 

    } 



private void huge() 
    { 
     richTextBox1.Invoke(new EventHandler(delegate 
      { 


        for (int i = 0; i < 10000; i++) 
        { 
         richTextBox1.Text += "s"; 
        } 

      })); 
     pictureBox1.Visible = false; 
    } 
+0

バックグラウンドワーカーを使用すると、ロックの問題が解決するはずです。ロードするコードが本当にbackgroundworkerにあることを確認してください。 – jdweng

+0

あなたのメソッドでは、UIスレッドが 'Invoke'を使ってタスクを実行しているので、UIスレッドはビジー状態を維持します。非同期/待機パターンを使用できます。 [this post](http://stackoverflow.com/a/39142535/3110834)が役に立つかもしれません。 –

+0

これをクリックで追加します。 BackgroundWorker bg = new BackgroundWorker(); bg.DoWork + = bg_DoWork; bg.RunWorkerAsync(); と同じ起こったagian。@ jdweng – Farshad

答えて

0

巨大機能しているときpictureBox1が凍結され、私はあなたがここに何をすべきかを説明してみましょう:

Task.Factory.StartNew(()=>; 
    { 
     huge(); 
    } 
     ); 

は=>

richTextBox1.Invoke(new EventHandler(delegate 
      { 


        for (int i = 0; i < 10000; i++) 
        { 
         richTextBox1.Text += "s"; 
        } 

      })); 
巨大な機能をexcecuteするスレッドを作成します。

=> UIスレッドを呼び出して(あなたが言ったように:only one UI Thread which executes synchronously)、ループを実行してtextBoxを更新します。

あなたが何をやろうとしたのか分かりませんが、通常は私たちがやっていることは、例えばbackgroundworkerでデータロード/フェッチ機能を実行していることです。ここでは、ロードのX%ごとにUIユーザーの情報を更新するスレッド。

あなたのケースでは、ユーザーのウェイターとしてのみgifを表示するようです。したがって、あなたは次のようなことができるはずです:

private void button1_Click (object sender, EventArgs e) 
    { 
    DisplayMyGif(); //will display the gif on the UI thread, because click always comes from the UI 
    Task.Factory.StartNew(()=>; 
    { 
     LoadMyData(); //should load the data asynchronously on a different Thread 
    } 
     ); 

    } 

希望に役立ちます。

+0

あなたのメールアドレスを教えていただけますか?私はちょうど私のコード行を送信したいと思います。それは約3つの機能ですが、ここにコメントするのに400文字の長さです – Farshad

関連する問題