2016-09-03 214 views
0

我一直在閱讀很長一段時間的示例,但不幸的是,我一直無法將解決方案應用到我正在使用的代碼中。一些快速的事實/什錦信息:在同步方法中調用異步

1)我是新的C#

2)貼在下面的代碼是從亞馬遜網絡服務(主要是股票)

3)的代碼,目的是修改將服務器信息與離線已下載的信息進行比較,並創建需要下載文件的列表。這個剪輯是從服務器端創建的列表,AWS的唯一選擇是調用異步,但在繼續前進之前,我需要完成此操作。

public void InitiateSearch() 
{ 
    UnityInitializer.AttachToGameObject(this.gameObject); 
    //these are the access key and secret access key for credentials 
    BasicAWSCredentials credentials = new BasicAWSCredentials("secret key", "very secret key"); 
    AmazonS3Config S3Config = new AmazonS3Config() 
    { 
     ServiceURL = ("url"), 
     RegionEndpoint = RegionEndpoint.blahblah 

    }; 
    //Setting the client to be used in the call below 
    AmazonS3Client Client = new AmazonS3Client(credentials, S3Config); 
    var request = new ListObjectsRequest() 
    { 
     BucketName = "thebucket" 
    }; 

    Client.ListObjectsAsync(request, (responseObject) => 
    { 

     if (responseObject.Exception == null) 
     { 
      responseObject.Response.S3Objects.ForEach((o) => 
      { 
       int StartCut = o.Key.IndexOf(SearchType) - 11; 
       if (SearchType == o.Key.Substring(o.Key.IndexOf(SearchType), SearchType.Length)) 
       { 
        if (ZipCode == o.Key.Substring(StartCut + 12 + SearchType.Length, 5)) 
        { 
         AWSFileList.Add(o.Key + ", " + o.LastModified); 
        } 
       } 
      } 

      ); 
     } 
     else 
     { 
      Debug.Log(responseObject.Exception); 
     } 
    }); 
} 

我不知道如何申請等待到Client.ListObjectsAsync行,我希望大家可以給我一些指導,讓我保持我的頭髮多幾年。

回答

1

您可以將您的方法標記爲異步並等待它,也可以在給出的任務上調用.Wait()或.Result()。

+0

所以在這種情況下,AWSFileList正在被填充,然後它返回到調用所有其他方法的主要方法。我應該在哪裏應用.wait()或.result()?我試着用這種方法標記asysnc,但每次都會拋出一個錯誤。 – Icewing726

0

我假設Client.ListObjectsAsync返回一個Task對象,所以您的具體問題的解決方案是這樣的:

public async void InitiateSearch() 
{ 
    //code 
    var collection = await Client.ListObjectsAsync(request, (responseObject) => 
    { 
     //code 
    }); 
    foreach (var item in collection) 
    { 
     //do stuff with item 
    } 
} 

變量result現在將填充物。您可能希望將返回類型InitiateSearch()設置爲Task,因此您也可以將它設爲await

await InitiateSearch(); //like this 

如果此方法是某種形式(如被稱爲一個點擊按鈕)的事件處理程序,然後就可以繼續使用void的返回類型。

從文檔的未發表的一部分的簡單介紹用於async-await

三件事需要使用異步-等待:

  • 任務對象:此目的是通過一種方法返回這是異步執行的。它允許您控制方法的執行。
  • await關鍵字:「等待」任務。將這個關鍵字的任務之前異步地等待它完成
  • async關鍵字:它使用的await關鍵字的所有方法都被標記爲異步

這也證明了這種使用關鍵字

一個小例子
public async Task DoStuffAsync() 
{ 
    var result = await DownloadFromWebpageAsync(); //calls method and waits till execution finished 
    var task = WriteTextAsync(@"temp.txt", result); //starts saving the string to a file, continues execution right await 
    Debug.Write("this is executed parallel with WriteTextAsync!"); //executed parallel with WriteTextAsync! 
    await task; //wait for WriteTextAsync to finish execution 
} 

private async Task<string> DownloadFromWebpageAsync() 
{ 
    using (var client = new WebClient()) 
    { 
     return await client.DownloadStringTaskAsync(new Uri("http://stackoverflow.com")); 
    } 
} 

private async Task WriteTextAsync(string filePath, string text) 
{ 
    byte[] encodedText = Encoding.Unicode.GetBytes(text); 

    using (FileStream sourceStream = new FileStream(filePath, FileMode.Append)) 
    { 
     await sourceStream.WriteAsync(encodedText, 0, encodedText.Length); 
    } 
} 

有些事情需要注意:

  • 您可以從任務異步操作指定一個返回值。 await關鍵字將等待,直到方法執行完成,並返回字符串。
  • Task對象包含方法執行的狀態,它可以作爲任何其他變量使用。
  • 如果發生異常(例如通過WebClient),它會在第一次使用await關鍵字時出現異常(在此示例中爲行結果result(...))
  • 建議命名將Task對象返回爲MethodNameAsync的方法

有關此更多信息,請參見http://blog.stephencleary.com/2012/02/async-and-await.html

1

我不知道如何申請等待到Client.ListObjectsAsync線

你可能只是把await在它的前面:

await Client.ListObjectsAsync(request, (responseObject) => ... 

只要你做到這一點, Visual Studio會給你一個錯誤。採取在錯誤消息好好看看,因爲它會告訴你正是下一步做什麼(標記InitiateSearchasync並改變它的返回類型爲Task):

public async Task InitiateSearchAsync() 

(這也是以添加一個好主意Async後綴跟在the common pattern)。

接下來,您將在調用InitiateSearchAsync的地方添加一個await,依此類推。