【发布时间】:2013-11-24 04:01:30
【问题描述】:
我想在调用中继命令时启动任务,但是只要该任务正在运行,我就想禁用该按钮
举个例子
private ICommand update;
public ICommand Update
{
get
{
if (update == null)
{
update = new RelayCommand(
param => Task.Factory.StartNew(()=> StartUpdate()),
param => true); //true means the button will always be enabled
}
return update;
}
}
检查该任务是否正在运行的最佳方法是什么?
这是我的解决方案,但不确定它是否是最好的方法
class Vm : ObservableObject
{
Task T;
public Vm()
{
T = new Task(() => doStuff());
}
private ICommand myCommand;
public ICommand MyCommand
{
get { return myCommand ?? (myCommand = new RelayCommand( p => { T = new Task(() => doStuff()); T.Start(); }, p => T.Status != TaskStatus.Running)); }
}
private void doStuff()
{
System.Threading.Thread.Sleep(5000);
}
}
更新:这里的每个答案都很好,但他们仍然不同意,我刚刚达到 100 的声誉,每当我达到 100 时我都会开始赏金,所以我正在寻找的是一个实现在 .net 4.0 的任务中执行的最佳非内存泄漏异步 RelayCommand
【问题讨论】:
-
@MerickOWA 它不适用于 Task.IsCompleted,使用
T.Status != TaskStatus.Running是最好的选择
标签: c# mvvm .net-4.0 task icommand