在一个Service的方法中运行多个任务

时间:2014-09-21 09:35:26

标签: c# windows-phone-8 mvvm async-await mvvmcross

使用简单的方法返回任务是一个好习惯:

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

最天真的方式是从viewmodel调用它们:

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

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

2 个答案:

答案 0 :(得分:3)

从您的服务中公开一个方法,该方法包含您现在拥有的async void Init()内容并从VM中调用它。您还可以提取接口并在viewmodel中注入(通过构造函数或属性)。

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...
}

答案 1 :(得分:0)

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

摆脱异步后的空白。因为它是&#34; fire and forget&#34;,你基本上启动了方法,但无法控制何时完成。在某些情况下可以,但如果可以,请避免使用它。