gpt4 book ai didi

c# - 有没有办法在 Task.Status 更改为运行时收到通知?

转载 作者:行者123 更新时间:2023-11-30 20:21:03 25 4
gpt4 key购买 nike

我正在编写一个运行任务并根据 this 发出通知的类.

我想不出解决方案的一个问题是当 Task.Status 从 TaskStatus.WaitingForActivation 变为 TaskStatus.Running 时如何通知。

下面是缩短的代码:

using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;

public abstract class ExecutionTracker : INotifyPropertyChanged
{
protected ExecutionTracker(Task task)
{
Task = task;
AwaitTask(task);
}

public event PropertyChangedEventHandler PropertyChanged;

public Task Task { get; }

public TaskStatus Status => Task.Status;

protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

private async void AwaitTask(Task task)
{
try
{
// This is where status goes from WaitingForActivation to Running
// and I want to do OnPropertyChanged(nameof(Status)) when it happens.
// A hack would be setting a flag awaiting = true here and return TaskStatus.Running if the flag is true.
// ^ feels nasty
await task.ConfigureAwait(false);
}
// ReSharper disable once EmptyGeneralCatchClause We don't want to propagate errors here. Just make them bindable.
catch
{
}

// Signal propertychanges depending on result
}
}

最佳答案

你不能(有效地)。如果您认为需要这样做,您可能做错了什么,和/或做出了一些无效的假设。

许多任务永远不会过渡到 TaskStatus.Running状态。例如,从 TaskCompletionSource<T> 创建的所有任务(包括异步方法返回的那些)直接从 WaitingForActivation 开始到 3 个已完成状态之一。当它转换到 Running 时,没有任何任务会暴露给它的调用者。 (如果确实如此,它根本不会)。

您可能粗略地了解它何时发生的唯一方法(除了轮询,这会很糟糕)是确保所有任务都安排在您的自定义 TaskScheduler 上。从而知道你什么时候要处决他们。但正如我所说,您实际上是在逆流而上,应该重新考虑您认为依赖于此的任何设计。

关于c# - 有没有办法在 Task.Status 更改为运行时收到通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34811639/

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