在一个服务中运行多个任务';s方法

本文关键字:任务 方法 一个 服务 运行 | 更新日期: 2023-09-27 18:23:50

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

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);
         }

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

在一个服务中运行多个任务';s方法

从您的服务中暴露一个方法,该方法封装您现在在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...
}

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

在async之后去掉void。因为它是"火和忘记",你基本上启动了这个方法,但无法控制它何时完成。在某些情况下,这是可以的,但如果可以的话,尽量避免。