2011-11-14 16 views
0

私はwinformsアプリケーションを開発中です。GetResponse()が長すぎます

私はURLを検証する機能を持っています。

private void checkForSPSiteValidity(DataGridView Sites_dataGridView) 
    { 
     foreach (DataGridViewRow myRow in SharePointSites_dataGridView.Rows) 
     { 
      try 
      { 
       DataGridViewImageCell cell = myRow.Cells[CommonCodeClass.status_GridCol] as DataGridViewImageCell; 

       string url = myRow.Cells[CommonCodeClass.spURL_GridCol].Value.ToString(); 

       WebRequest req = WebRequest.Create(url); 

       WebResponse res = req.GetResponse(); 

       cell.Value = Image.FromFile(CommonCodeClass.Correct_Icons); 

      } 
      catch (WebException ex) 
      { 
       Console.WriteLine(ex.Message); 
       if (ex.Message.Contains("remote name could not be resolved")) 
       { 
        DataGridViewImageCell cell = myRow.Cells[CommonCodeClass.status_GridCol] as DataGridViewImageCell; 

        cell.Value = Image.FromFile(CommonCodeClass.warning_Icon); 
       } 
      } 
     } 
    } 

このコードは正常に動作していると私は正しい値を取得しますが、これを処理するために長い間に取っていると時間のほとんどのアプリケーションは、絞首刑にされます。

私はスレッドに慣れているので、それを実装する方法があります。 例が本当に役に立ちます

これ以外の方法がある場合は、教えてください。

おかげ

答えて

2

BackgroundWorkerコントロールをチェックしてください。これが簡単な方法です。

HTH。

+0

これは素晴らしいです...しかし、私はそれを実装するいくつかの問題を抱えています。あなたはそれで私を助けてくれますか?どのようにバックグラウンド関数を呼び出すかのように。私にサンプルや何かを見せることができます – user175084

+0

この例を見てください:http://msdn.microsoft.com/en-us/library/hybbz6ke.aspx –

+0

本質的に、コントロールは別のスレッドで操作を実行します。主にDoWorkイベントを処理し、最後にWebリクエストの結果をe.Resultプロパティに渡します。フォームに直接返すことはできませんが、代わりにe.Resultを通して返す必要があります。フォーム内では、このイベントargを介して結果にアクセスし、元々はそれを行う必要があります。 –

1

あなた自身が解決策を指摘しているので、フェッチを非同期に実行する必要があります。 BackgroundWorkerは、特にネイティブのWinFormsコンポーネントであるため、良いクラスです。

さらに一般的な方法で解決したい場合は、C#の新しい拡張子asyncを調べることもできます。

1

これを行うための素晴らしい方法は、スレッドプールを使用している:

それは実現するのは簡単だし、大量のリクエストを噛み砕くで素晴らしいことです。

最大スレッド数を指定して15,25,50などのループを実行するように指定することもできます。スレッドをあまりにも多くカットしないと、スレッドが増えてしまい、メリットがあります。私はあなたが最適化を緩め始める時を見つけ出すためにそれを使います。

良いことは、(最初​​のリンクを参照)、これは単一の値である必要はないオブジェクト(Object threadContext)を渡すことです...配列、リストなどのようにキャストできますオブジェクト。リストなどで作業するときは、スレッドの安全性について少し調べなければならないかもしれませんが、これはおそらく今の時点でスレッディングを行っていると感じています。

参考にしてください。

関連する問題