2013-04-09 66 views
1

我有这样的代码这段代码是否同步,因为我希望它是?

public async Task<IEnumerable<WebResult>> SearchAsynch(string query) 
{ 
    if (query == null) 
    { 
    throw new ArgumentNullException("query cannot be null"); 
    } 

    DataServiceQuery<WebResult> webQuery = 
_bingContainer.Web(query, null, null, null, null, null, null, null); 

    return await Task.Factory.FromAsync 
       (webQuery.BeginExecute(null, null) 
       , asyncResult => webQuery.EndExecute(asyncResult) 
       ); 
} 

我把它叫做从而

public static void Main() 
{ 
    Search().Wait(); 
} 

private static async Task Search() 
{ 
    IWebSearcher webSearcher = new WebSearcher(); 
    for (var i = 0; i < 100; i++) 
    { 
     IEnumerable<WebResult> task = await webSearcher.SearchAsynch(i.ToString()); 

     var enumerator = task.GetEnumerator(); 
     enumerator.MoveNext(); 
     Console.WriteLine(enumerator.Current.Title); 
    } 
} 

我的问题是这样。我希望这100个电话中的每一个都与SearchAsynch完全无关,因此第10个电话可能会在第9个电话之前返回并打印出结果。这似乎并没有发生在这一刻。我做错了什么?

回答

2

做处理作为完成任务的最简单方法是定义做了处理一个单独的方法,因为这样的:

public static async Task SearchAndPrintAsync(IWebSearcher webSearcher, string query) 
{ 
    var result = await webSearcher.SearchAsync(query); 
    using (var enumerator = result.GetEnumerator()) 
    { 
    if (enumerator.MoveNext()) 
     Console.WriteLine(enumerator.Current.Title); 
    else 
     Console.WriteLine("<none>"); 
    } 
} 

然后,你可以做并发async操作这样:

private static async Task MainAsync() 
{ 
    IWebSearcher webSearcher = new WebSearcher(); 

    // Start all SearchAndPrint operations concurrently. 
    Task[] tasks = Enumerable.Range(0, 100) 
     .Select(i => SearchAndPrintAsync(webSearcher, i)) 
     .ToArray(); 

    // Wait for them all to complete. 
    await Task.WhenAll(tasks); 

    Console.WriteLine("Done"); 
} 

public static void Main() 
{ 
    MainAsync().Wait(); 
} 
+1

“SearchAndPrintAsync”方法违反了关注点的分离。它将数据访问和演示混合在一起。 – Servy 2013-04-09 15:42:25

+2

我假设op只给了我们示例代码,所以'Console.WriteLine'在逻辑上代表“做进一步处理”。 – 2013-04-09 15:45:49

+0

顺便说一句,我认为使用'First()'(或'FirstOrDefault()')比调用枚举器更简单。 (但我意识到你只是从问题中复制并修复了它。) – svick 2013-04-09 18:53:36

相关问题