2

次のコードが与えられます:

if (!string.IsNullOrEmpty(link1))
{
    string[] link1_ar = link1.Split(sep, StringSplitOptions.None);
    string page1 = link1_ar[1];
    string filter1 = link1_ar[2];
    string code2 = link2_ar[3];
    MyMethod(summary, page1, filter1, code1);
}
if (!string.IsNullOrEmpty(link2))
{
    string[] link2_ar = link2.Split(sep, StringSplitOptions.None);
    string page2 = link2_ar[1];
    string filter2 = link2_ar[2];
    string code2 = link2_ar[3];
    MyMethod(summary, page2, filter2, code2);
}
if (!string.IsNullOrEmpty(link3))
{
    string[] link3_ar = link3.Split(sep, StringSplitOptions.None);
    string page3 = link3_ar[1];
    string filter3 = link3_ar[2];
    string code3 = link3_ar[3];
    MyMethod(summary, page3, filter3, code3);
}


    private void MyMethod(ref string summary, string bid_page, string bid_filter, string bid_code, string bid_silver)
    {
        bla bla bla
    }

3つのMyMethodを同時に実行したい!
その目的を達成するために、これらのコードで何を変更する必要がありますか?

4

2 に答える 2

3

MyMethod が実際にスレッド セーフであると仮定すると、.Net 4.0 で Parallel.ForEach() メソッドを使用して次のように動作するはずです。ConcurrentDictionary で個々の要約を追跡しているので、後で必要に応じてリンクで参照できます。

また、要約を返すように MyMethod() を変更したと仮定しました。

List<string> links = new List<string>() { link1, link2, link3};

ConcurrentDictionary<string, string> summariesByLink = new ConcurrentDictionary<string, string>();

Parallel.ForEach(links, link => {

  if (!string.IsNullOrEmpty(link))
  {
    string[] link_ar = link.Split(sep, StringSplitOptions.None);
    string page = link_ar[1];
    string filter = link_ar[2];
    string code = link_ar[3];
    string summary = MyMethod( page, filter, code);

    summariesByLink.Add(link, summary);
  }
}
于 2012-12-12T02:55:05.270 に答える
1

MyMethod への各呼び出しをタスクにラップし、すべてが完了するまで待機してみてください。

var tasks = new List<Task>();

if (!string.IsNullOrEmpty(link1))
{
    string[] link1_ar = link1.Split(sep, StringSplitOptions.None);
    string page1 = link1_ar[1];
    string filter1 = link1_ar[2];
    string code2 = link2_ar[3];
    var link1task = Task.Run(MyMethod(summary, page1, filter1, code1));
    tasks.Add(link1task);
}
if (!string.IsNullOrEmpty(link2))
{
    string[] link2_ar = link2.Split(sep, StringSplitOptions.None);
    string page2 = link2_ar[1];
    string filter2 = link2_ar[2];
    string code2 = link2_ar[3];
    var link2task = Task.Run(MyMethod(summary, page2, filter2, code2));
    tasks.Add(link2task);
}
if (!string.IsNullOrEmpty(link3))
{
    string[] link3_ar = link3.Split(sep, StringSplitOptions.None);
    string page3 = link3_ar[1];
    string filter3 = link3_ar[2];
    string code3 = link3_ar[3];
    var link3task = Task.Run(MyMethod(summary, page3, filter3, code3));
    tasks.Add(link3task);
}

Task.WaitAll(tasks.ToArray());
于 2012-12-12T01:41:26.287 に答える