2014-09-21 94 views
1

这是一个很好的做法,有一个简单的方法,它返回任务:运行多个任务

public class MessageService : IMessageService 
{ 
    public Task<IEnumerable<Message>> DownloadMessagesTask() 
    { 
     return MyWebClient.GetMessages(); 
    } 

现在,我想缓存添加到本地存储:

public Task<bool> WriteMessagesTask(IEnumerable<Message> list) 
    { 
     return MyIsoStorageManager.Write(list); 
    } 
    // same for reading 

最简单的方式是从视图模型打电话给他们:

public async void Init() 
    { 
     var result = await messageService.ReadMessagesTask(); 
     if (result == null) 
     { 
      MessagesList = await messageService.DownloadMessagesTask(); 
      var writingResult = await messageService.WriteMessagesTask(MessagesList); 
     } 

但我怎么能这样的逻辑存储服务,只是为了避免代码重复在另一个viewmodels?或者我应该保持服务清洁并在视图模型中调用任务?

+0

它以后缀的方法名的好约定返回'Task'用'Async' – 2014-09-21 10:23:37

+0

@RussCam我认为它返回的人'Task'应后缀为'* Task' – 2014-09-21 10:25:01

+1

请参阅http://msdn.microsoft.com/en-us/library/hh873175.aspx,具体命名,参数和返回类型 – 2014-09-21 10:27:16

回答

3

从您的服务中揭示一种方法,将您现在拥有的内容包含在async void Init()中,并从VM调用它。你也可以提取接口并将其注入视图模型(通过构造函数或属性)。

META

public class MyViewModel 
{ 
    public MyViewModel() 
     :this(new Service()) 
    {} 

    public MyViewModel(IService service) 
    { 
     Service = service; 
     Initialize(); 
    } 

    public IService Service { get; set; } 

    private async void Initialize() 
    { 
     // Fire forget 
     await Service.DoSomething(); 
    } 
} 

META

public interface IService 
{ 
    // change if you need to return something 
    Task DoSomething(); 
} 

public Service : IService 
{ 
    public async Task DoSomething() 
    { 
     var result = await ReadMessagesAsync(); 
     if (result == null) 
     { 
      var messages = await DownloadMessagesAsync(); 
      await WriteMessagesAsync(messages); 
     } 
    } 

    // private read/write/download methods here... 
} 
+0

我假设你的'Service'和'MessageService'是一个服务? – 2014-09-21 11:12:42

+0

是的。以上只是直接写入SO中的“meta”。 – 2014-09-21 11:13:48

0

也许你会冷静地将这些方法分解成一些辅助类,并在你认为合适的时候在视图模型中使用它们。或者,如果你已经有了一些基本的viewmodel类(例如INotifyPropertyChanged),你可以将它们移动到那里,假设它们主要用于视图模型。

摆脱async后的空白。因为它是“火和遗忘”,你基本上启动了方法,但无法控制何时完成。在某些情况下,它是可以的,但如果可以的话避免它。

+0

中有什么好吧,将它们存储在辅助类中听起来像是一种解决方法 - 我对“本地”解决方案感兴趣。修复了无效问题 - 实际上,我通常会尽量避免它。 – 2014-09-21 10:21:15