2014-07-16 5 views
2

안녕하세요 목록에 항목을 비동기 적으로 추가하려고하는데 어떻게 완료되었는지 확실하지 않습니다. 잘못된 구문을 사용하고있는 경우 이것이 제가 지금 가지고있는 것입니다. :List.add() 비동기 작업이 올바른 구문을 기다리고 있습니다

내보기 :

await viewModel.getMessages(); 
list.ItemsSource = viewModel.Messages; 

내보기 모델 : 나는 전체 개념 권리를 얻고 만약 내가 확실하지 오전하지만 어떻게 내가 내 목록에 항목을 추가 기다리고 있습니다

public List<Message> Messages { get; set; } 

     public async Task getMessages() 
     { 
      await GetRemoteMessages(); 
     } 

     private async Task GetRemoteMessages() 
     { 
      var remoteClient = new ChiesiClient(); 
      var messages = await remoteClient.getMessages().ConfigureAwait(false); 
      //App.Database. 
      await SaveAll(messages).ConfigureAwait(false); 
     } 

     public async Task SaveAll(IEnumerable<Message> _messages) 
     { 
      foreach (var item in _messages) 
      { 
       await SaveMessage(item); 
      } 
     } 

     public async Task SaveMessage(Message item) 
     { 
      await Messages.Add(new Message // Cannot await void 
      { 
       Title = item.Title, 
       Description = item.Description, 
       Date = item.Date, 
       Url = item.Url 
      }); 
     } 

? 이 작업을 수행하는 올바른 방법은 무엇입니까?

+1

이치에 맞지 않습니다. 왜 당신은 당신의 목록에 새로운 항목을 추가하기를 기다리고 싶습니까? –

+0

[TPL] (http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110) .aspx) 및 [RX] (http : //rx.codeplex .com /). 나는 Xamarin으로 얼마나 잘 플레이하고 있는지 잘 모르겠지만, Xamarin은 꽤 좋은 커버리지를 가지고있어서 그게 문제가되어서는 안된다. –

+1

목록에 항목을 추가하는 것은 비동기 적으로 실행하여 이익을 보는 작업이 아닙니다. –

답변

9

을 입력하면으로 비동기 적으로 목록에 항목을 추가 할 수 있습니다. 실제로 이점이 없습니다.

코드가 괜찮 으면 원격 서비스에서 메시지를 가져온 후에 동 기적으로 모든 작업을 수행하면됩니다.

public List<Message> Messages { get; set; } 

    public async Task getMessages() 
    { 
     await GetRemoteMessages(); 
    } 

    private async Task GetRemoteMessages() 
    { 
     var remoteClient = new ChiesiClient(); 
     var messages = await remoteClient.getMessages().ConfigureAwait(false); 
     //App.Database. 
     SaveAll(messages); 
    } 

    public void SaveAll(IEnumerable<Message> _messages) 
    { 
     foreach (var item in _messages) 
     { 
      SaveMessage(item); 
     } 
    } 

    public void SaveMessage(Message item) 
    { 
     Messages.Add(new Message // Cannot await void 
     { 
      Title = item.Title, 
      Description = item.Description, 
      Date = item.Date, 
      Url = item.Url 
     }); 
    } 

이제는 remoteClient.getMessages()이 오래 걸릴 수 있습니다. I/O 바운드 작업입니다. 밀리 초가 걸릴 수도 있고 10 분이 걸릴 수도 있습니다. 우리는 모른다. 우리는 알 수 없다. 실제로 실제로 10 분이 지나면 UI 전체가 잠기는 것을 원하지 않습니다. await 키워드를 사용하면 해당 작업을 시작한 다음 다시 UI에 제어 권한을 부여합니다. 작업이 완료되면 나머지 작업이 계속됩니다.

작업중인 원래 예제는 데이터를 데이터베이스에 저장합니다. 이것이 또 다른 I/O 바운드 작업이기 때문에 데이터베이스 API 작성자는 친절하게도 비동기 API를 제공하여 도움을받습니다.

예제를 수정하여 결과를 목록에 넣으십시오. 목록에 추가하는 것은 I/O 바운드 작업이 아닙니다. 사실, 그것은 거의 즉시입니다. 결과적으로 비동기 API가 없습니다. 이 부분을 비동기 적으로 수행 할 필요는 없습니다.

관련 문제