gpt4 book ai didi

C# 简单的后台线程

转载 作者:太空狗 更新时间:2023-10-29 20:24:43 25 4
gpt4 key购买 nike

我正在寻找一种在后台执行任务的简单方法,然后在它完成时(在主线程上)更新一些东西。它位于低级别的“模型”类中,因此我无法调用 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());
}

这似乎工作正常,但是

1) 这是最好(最简单)的方法吗?

2) 我担心局部变量:

Item{} items=null

当方法在后台线程完成之前返回时,是什么阻止了它消失?

谢谢。

最佳答案

我认为您的方法稍微违反了 Single Responsibility Principle ,因为它做的太多了。

首先,我建议更改 CreateItems 以返回 Task 而不是将其包装在 GetItemsAsync 中:

public Task<Item[]> CreateItems(CancellationToken token)
{
return Task.Factory.StartNew(() =>
// obtaining the data...
{});
}

CancellationToken是可选的,但如果您能够取消此长时间运行的操作,则可以为您提供帮助。

使用此方法,您可以完全删除 GetItemsAsync,因为客户端无需传递此委托(delegate)即可轻松处理结果:

// 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());

使用这种方法,您将获得只有一个责任的更清晰的代码。 Task类本身是将异步操作表示为 first class object 的完美工具.使用建议的技术,您可以轻松地通过单元测试的虚假行为来模拟您当前的实现,而无需更改您的客户端代码。

关于C# 简单的后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13581592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com