1

C# 4.0 を使用して、以下に示す関数 foo() 内から UI を更新する簡単で堅牢な方法を知りたいです。処理された URL の数と検出された不良リンクの数を表示するテキスト ボックスを更新する必要があります。私が非同期タスクで採用した一般的なアプローチは、ここで見つけたアプローチに基づいています。

HttpWebRequest (.NET) を非同期で使用するには?

Pseudo Code in my code-behind on the form:

1. populate a ConcurrentBag
2. Task.Factory.StartNew ( () =>
          Parallel.ForEach( ConcurrentBag, (d) =>
           {
             MyAsyncTask(d);

           }

MyAsyncTask は次のことを行います。

          <snip>
          try
            {

             IAsyncResult result = myWebRequest.BeginGetResponse (
               new AsyncCallback( foo, state);



            ThreadPool.RegisterWaitForSingleObject(
            result.AsyncWaitHandle,
            new WaitOrTimerCallback(TimeoutCallback),
            state,
            (MSEC * 1000),  
            true
            );

           }
          catch (Exception ex) {}

            private void foo(IAsyncResult result)

            {
            RequestState state = (RequestState)result.AsyncState;
            WebRequest request = state.webRequest;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result);

            //update the UI ??

            }
4

2 に答える 2

1

まず、少しコードを確認します。

  • あなたは必要ありませんConcurrentBag(aList<>が行います)
  • は必要ありませんParallel.ForEach()BeginGetResponse()ブロックしない
  • 同じ理由で、おそらく Factory.StartNew() タスクも必要ないでしょう。
  • catch (Exception ex) {}エラーを非表示にするだけを使用する

それを適用すると、コードがはるかに単純になります。

そしてfoo(IAsyncResult result)、 を使用して、通常の方法で UI を更新できますControl.Invoke()これは、ここのように何度も質問され、回答されています。

于 2013-07-24T20:32:30.487 に答える
0

あなたは言う:

私は、100,000 個の URL を反復処理し、各 URL が生きているか死んでいるかをテストし、そのプロセスにできるだけ時間がかからないようにするものを書くことを任されています。

そのために非同期は必要ありません。これを行うだけです:

IEnumerable<string> urls = GetUrls(); //you provide this
var results =
 urls
 .AsParallel().WithDegreeOfParallelism(50)
 .Select(url => CheckUrl(url))
 .ToList();

PLINQ は、すべての並列処理と同期を処理します。同期CheckUrl関数を提供するだけです。可能な例外をCheckUrl戻り値に格納します。

Async は、WinForms/WPF や大量のスレッドがある場合に最適です。50は「トン」ではありません。

于 2013-07-25T14:48:06.700 に答える