C#中的调度队列类似于Objective-C吗?

4

我希望在C#中模仿Objective-C调度队列的行为。我发现有一个任务并行库,但我真的不明白如何使用它,并希望能得到一些解释。

在Objective-C中,我会这样做:

-(void)doSomeLongRunningWorkAsync:(a_completion_handler_block)completion_handler
{
 dispatch_async(my_queue, ^{
   result *result_from_long_running_work = long_running_work();
   completion_handler(result_from long_running_work);
 });
}

-(void)aMethod
{
  [self doSomeLongRunningWorkAsync:^(result *) { // the completion handler
    do_something_with_result_from_long_running_async_method_above;
  }];

}

这个如何转化为C#风格的任务并行库?

有什么比较网站吗?


1
对于我们中不知道Objective C或其库的人,您能解释一下您实际想要什么吗?另外,您能使用C# 5.0吗? - svick
1
我可以使用C# 5。在Objective-C中,您创建代码块(花括号中的内容),并将它们作为表达式发送到“调度队列”(类似于函数指针-块中是要执行的代码)-调度队列充当由框架管理的不同后台线程的抽象。队列发送块并立即返回,保证块按照它们发送到队列的顺序FIFO运行。如果您想从块中获取值,则提供回调(函数中的“结果”类型)。 - Avba
这听起来非常接近 C# 5.0 中的 async-await(除了您不需要回调函数)。我建议您阅读相关资料,如果有具体问题再回来咨询。 - svick
我已经阅读了文档,但它似乎很复杂。我的问题简而言之是如何创建一个返回任务的方法,使得我的任务可以异步运行。 - Avba
1个回答

1

如果您只想在后台线程上执行一些长时间运行的CPU密集型代码,并在完成后在UI线程上处理结果,请使用 Task.Run()await 结合使用:

async Task AMethod()
{
    var result = await Task.Run(() => LongRunningWork());
    DoSomethingWithResult(result);
}

AMethod()现在是一个async Task方法,这意味着它的调用者也必须是一个async方法。


有没有办法以内联方式进行操作,也就是使用Func<>Action<>?我的意思是,我需要创建一个全新的函数还是可以将Func<>Action<>声明为async - damian
有没有办法反过来实现:从后台线程调度到主线程? - helmesjo
1
@svick 怎么了?如果我在后台线程上运行序列化器,但想要保证 ISerializeCallback 方法(在序列化之前等)在主线程上被调用,这听起来完全没问题...(当然,在这里需要等待主线程完成)。 - helmesjo
@helmesjo,我不知道具体情况,但序列化听起来就像是不应该与UI交互的东西(这就是为什么通常需要在UI线程上运行)。 - svick
这个解决方案可以帮助解决在后台获取时调用服务时出现的与“您没有权限将文件“CallDirectory”保存到文件夹“Library”中”的所有相关问题。 - Marcos José Pérez Pérez
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接