Bbx*_*Bbx 7 c# multithreading background task
我正在寻找一种在后台执行任务的简单方法,然后在完成时更新某些内容(在主线程上).它处于低级"模型"类中,因此我无法调用InvokeOnMainThread,因为我没有NSObject.我有这个方法:
public void GetItemsAsync(Action<Item[]> handleResult)
{
Item[] items=null;
Task task=Task.Factory.StartNew(() =>
{
items=this.CreateItems(); // May take a second or two
});
task.ContinueWith(delegate
{
handleResult(items);
}, TaskScheduler.FromCurrentSynchronizationContext());
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但是
1)这是最好的(最简单的)方式吗?
2)我担心局部变量:
Item{} items=null
Run Code Online (Sandbox Code Playgroud)
当方法在后台线程完成之前返回时,什么停止消失?
谢谢.
我认为你的方法稍微违反了单一职责原则,因为它做得太多了。
首先,我建议更改CreateItems为 returnTask而不是将其包装在GetItemsAsync:
public Task<Item[]> CreateItems(CancellationToken token)
{
return Task.Factory.StartNew(() =>
// obtaining the data...
{});
}
Run Code Online (Sandbox Code Playgroud)
CancellationToken是可选的,但如果您能够取消此长时间运行的操作,它可以为您提供帮助。
使用此方法,您可以GetItemsAsync完全删除,因为您的客户端在不传递此委托的情况下处理结果非常简单:
// Somewhere in the client of your class
var task = yourClass.CreateItems(token);
task.ContinueWith(t =>
// Code of the delegate that previously
// passed to GetItemsAsync method
{}, TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您将获得更清晰的代码,并且只需承担一项责任。任务类本身是将异步操作表示为第一类对象的完美工具。使用建议的技术,您可以轻松地通过单元测试的虚假行为来模拟当前的实现,而无需更改客户端代码。
| 归档时间: |
|
| 查看次数: |
1449 次 |
| 最近记录: |