2016-09-03 213 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,依此类推。