在一个服务中运行多个任务';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);
}
但是,为了避免代码在另一个视图模型中重复,我如何将此逻辑存储在服务中呢?还是应该保持服务清洁并在视图模型中调用任务?
从您的服务中暴露一个方法,该方法封装您现在在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。因为它是"火和忘记",你基本上启动了这个方法,但无法控制它何时完成。在某些情况下,这是可以的,但如果可以的话,尽量避免。