Task.Run和JoinableTaskFactory.Run之间有什么区别?

3

假设我有一个需要从非异步方法调用的异步方法/任务,并且我可以使用JoinableTaskFactory来执行此操作,就像这样:

var jtf = new JoinableTaskFactory(new JoinableTaskContext());
var serviceResponse = jtf.Run(async () =>  await _service.UpdateSomethingAsync(requestObject));

它与这个有什么不同:

var task = System.Threading.Tasks.Task.Run(async () => await _service.UpdateSomethingAsync(requestObject));
var serviceResponse = task.Result;

或者这样:

ServiceResponse serviceResponse = null;

var task = Task.Run(async () => serviceResponse = await _service.UpdateSomethingAsync(requestObject));
Task.WaitAll(task);

如果我有一个需要从非异步方法执行的任务,那么实际上最好的做法是什么,因为有很多可选项可供选择?


6
JoinableTaskFactory 提供了一个专门为编程 Visual Studio 功能而设计的 API 接口。除非你正在进行这方面的工作,否则我不建议依赖它。 - Aluan Haddad
6
JoinableTaskFactory 提供了一个专门为编程 Visual Studio 功能而设计的 API 接口。除非你正在进行这方面的工作,否则我不希望对它产生依赖。 - Aluan Haddad
6
JoinableTaskFactory 提供了一个专门为编程 Visual Studio 功能而设计的 API 接口。除非你正在进行这方面的工作,否则我不希望对其进行依赖。 - undefined
1
你链接的诊断与JoinableTaskFactory无关。它是在警告你正确使用async/await/Task。你应该使用await Task.WhenAll。使用WaitAll会阻塞,应该避免使用。 - Aluan Haddad
1
你链接的诊断与JoinableTaskFactory无关。它是在警告你正确使用async/await/Task。你应该使用await Task.WhenAll。使用WaitAll会阻塞,应该避免使用。 - Aluan Haddad
显示剩余14条评论
1个回答

2
我正在复制粘贴 Andrew Arnott 的评论,来自一个与之相关的 GiHub 问题。这可能会让你对为什么存在 JoinableTaskFactory 类有所了解。
考虑一个需要UI线程完成的值工厂。它通过AsyncLazy<T>.GetValueAsync(在任意线程上)被调用。现在,在值工厂能够到达UI线程之前(即使它在UI线程上启动,但在需要之前放弃了),UI线程决定阻塞直到某个异步操作完成。如果该异步操作只会在值工厂完成后才完成,那么为了避免死锁,必须允许值工厂进入UI线程。这需要一些谨慎的依赖跟踪,以便阻塞UI线程的内容知道需要允许哪些工作进入,以避免死锁,同时避免让无关的工作进入,可能导致崩溃、挂起、数据损坏等问题。这就是JoinableTaskFactory的作用所在,也是为什么我们需要一个JoinableTaskFactory感知的AsyncLazy<T>,以遵循规则并避免此类问题。
另外来自另一个评论
问题在于vs-threading是与VS特定的。
为什么这样说?整个vs-threading库完全独立于VS,将始终如此。它也针对.NET Standard,并且我们在所有操作系统上都运行了在.NET Framework和.NET Core上的测试。

2
“受欢迎?” 这真的是一个因素吗?有很多像 Span<T> 这样的东西只在特定情况下使用。它们不受欢迎并不意味着它们没有用处。 - Robert Harvey
2
"流行?" 这真的是一个因素吗?有很多像 Span<T> 这样的东西,只在特定情况下使用。它们的不受欢迎并不意味着它们没有用处。 - Robert Harvey
2
"流行?" 这真的是一个因素吗?有很多像 Span<T> 这样的东西,只在特定情况下使用。它们的不受欢迎并不意味着它们不够有用。 - undefined
@RobertHarvey "popular"可能不是正确的措辞。对我来说,JoinableTaskFactory更像是一个解决方案在寻找问题,而不是相反。我从未在StackOverflow上看到过一个问题的被接受答案涉及到JoinableTaskFactory。相反,我看到了一些问题,比如这个,其中JoinableTaskFactory本身就是问题,而不是答案。所以,通过“popular”,我指的是“被广泛认为是有用的东西”。这是我的预测,也许我会被证明是错误的。 - Theodor Zoulias
@RobertHarvey "popular"可能不是正确的用词。对我来说,JoinableTaskFactory更像是一个解决方案在寻找问题,而不是相反。我从来没有在StackOverflow上看到过一个问题的被接受答案涉及到JoinableTaskFactory。相反,我看到了一些问题,比如这个,其中JoinableTaskFactory就是问题,而不是答案。所以,当我说"popular"时,我的意思是"被广泛认为是有用的东西"。这是我的预测,但我可能会被证明错误。 - Theodor Zoulias

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