gpt4 book ai didi

c# - 什么是 Task.RunSynchronously?

转载 作者:可可西里 更新时间:2023-11-01 08:09:57 27 4
gpt4 key购买 nike

我只是想知道这个方法有什么用?在什么样的场景下我可以使用这个方法。

我最初的想法是 RunSynchronously 用于调用异步方法并同步运行该方法,而不会像 .wait() 那样导致死锁问题。

然而,根据MSDN ,

Ordinarily, tasks are executed asynchronously on a thread pool thread and do not block the calling thread. Tasks executed by calling the RunSynchronously() method are associated with the current TaskScheduler and are run on the calling thread. If the target scheduler does not support running this task on the calling thread, the task will be scheduled for execution on the schedule, and the calling thread will block until the task has completed execution

如果任务要在调用线程上运行,为什么这里需要一个 TaskScheduler?

最佳答案

RunSynchronously 将何时开始任务的决定委托(delegate)给当前任务调度程序(或作为参数传递的调度程序)。

我不确定它为什么存在(可能是为了内部或遗留用途),但很难在当前版本的 .NET 中找到有用的用例。 @Fabjan has a possible explanation in his comment问题。

RunSynchronously 要求调度程序同步运行它,但调度程序很可能会忽略该提示并在线程池线程中运行它,您当前的线程将同步阻塞直到它完成。

调度器不必在当前线程上运行它,也不必立即运行它,尽管我认为这是常见调度器(ThreadPoolTask​​Scheduler 和通用 UI 调度器)上会发生的事情。

RunSynchronously 如果任务已经启动或已完成/出错(这意味着您将无法在异步方法上使用它),也会抛出异常。

这段代码可以阐明不同的行为:

WaitResult 根本不运行任务,它们只是等待当前线程上的任务完成并阻塞它直到完成所以如果我们想要为了比较,我们可以将StartWaitRunSynchronously进行比较:

class Scheduler : TaskScheduler
{
protected override void QueueTask(Task task) =>
Console.WriteLine("QueueTask");

protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued)
{
Console.WriteLine("TryExecuteTaskInline");

return false;
}

protected override IEnumerable<Task> GetScheduledTasks() => throw new NotImplementedException();
}

static class Program
{
static void Main()
{
var taskToStart = new Task(() => { });
var taskToRunSynchronously = new Task(() => { });

taskToStart.Start(new Scheduler());
taskToRunSynchronously.RunSynchronously(new Scheduler());
}
}

如果您尝试注释 Start 或 RunSynchronously 并运行代码,您将看到 Start 尝试将任务排队到调度程序,同时 RunSynchronously 将尝试内联执行它,如果失败(返回 false),它只会将其排队。

关于c# - 什么是 Task.RunSynchronously?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52759608/

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