运行多个任务
这是一个很好的做法,有一个简单的方法,它返回任务:运行多个任务
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?或者我应该保持服务清洁并在视图模型中调用任务?
从您的服务中揭示一种方法,将您现在拥有的内容包含在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...
}
我假设你的'Service'和'MessageService'是一个服务? – 2014-09-21 11:12:42
是的。以上只是直接写入SO中的“meta”。 – 2014-09-21 11:13:48
也许你会冷静地将这些方法分解成一些辅助类,并在你认为合适的时候在视图模型中使用它们。或者,如果你已经有了一些基本的viewmodel类(例如INotifyPropertyChanged),你可以将它们移动到那里,假设它们主要用于视图模型。
摆脱async后的空白。因为它是“火和遗忘”,你基本上启动了方法,但无法控制何时完成。在某些情况下,它是可以的,但如果可以的话避免它。
中有什么好吧,将它们存储在辅助类中听起来像是一种解决方法 - 我对“本地”解决方案感兴趣。修复了无效问题 - 实际上,我通常会尽量避免它。 – 2014-09-21 10:21:15
它以后缀的方法名的好约定返回'Task'用'Async' – 2014-09-21 10:23:37
@RussCam我认为它返回的人'Task'应后缀为'* Task' – 2014-09-21 10:25:01
请参阅http://msdn.microsoft.com/en-us/library/hh873175.aspx,具体命名,参数和返回类型 – 2014-09-21 10:27:16