我正在编写一个运行任务并基于通知的类this https://msdn.microsoft.com/en-us/magazine/dn605875.aspx.
我想不出解决方案的一个问题是如何在 Task.Status 离开时发出通知TaskStatus.WaitingForActivation
to 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
状态。例如,从 a 创建的所有任务TaskCompletionSource<T>
(包括异步方法返回的)直接从WaitingForActivation
到 3 个已完成状态之一。并且当任务转换为Running
(如果确实如此,那么它确实如此)。
你可能知道的唯一方法roughly当它发生时(除了轮询,这会很糟糕),如果您确保所有任务都按照您的自定义安排TaskScheduler
从而知道你什么时候要处决他们。但正如我所说,你真的是在逆流而上,应该重新考虑你认为依赖于此的任何设计。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)