【问题标题】:How to Initialize the Task Object?如何初始化任务对象?
【发布时间】:2013-10-29 14:23:09
【问题描述】:

这个问题是微不足道的,它是为了可读性。我只想知道天气下面这行代码有什么替代方法吗?该代码在可读性和样式方面是否正确?

Task newTask = new Task(() => { });

编辑:

此任务将在满足特定条件/规则时创建。在这种情况下,我会为这个类分配一个Action

if(condition Met && newTask.Status != TaskStatus.Running )
{
  newTask = Task.Factory.StartNew(Action);
  }

谢谢

【问题讨论】:

  • 所以你的问题是:“这是在 C# 中表达无操作任务的惯用方式吗?”
  • 是的。我想在需要但不运行时进行初始化
  • 那么你现在的问题是什么?
  • 我想知道这个创建任务的代码约定是否正确?
  • 如果你关心可读性和风格,那么我建议var newTask = new Task(() => { });,即在不需要时不要重复Task

标签: c# .net styles code-readability


【解决方案1】:

Task 对象并不意味着可以多次运行并随意启动和停止。如果您取消一个任务或它运行完成,您将在下次想要再次执行它时创建一个新的任务对象。您可以保留对任务对象的引用并使用CancellationTokenSource 取消它。

我建议简单地通过布尔变量或任务变量本身来跟踪任务是否正在运行,其中空值表示任务未运行。例如:

private CancellationTokenSource _tokenSource = new CancellationTokenSource();
private Task _task;

public void StartDoingSomething()
{
    if (_task == null)
    {
        _task = Task.Factory.StartNew(Worker, _tokenSource.Token)
                            .ContinueWith(_ => _task = null);
    }
}

public void StopDoingSomething()
{
    if (_task != null)
    {
        _tokenSource.Cancel();
    }
}

private void Worker()
{
    while (!_tokenSource.IsCancellationRequested)
    {
        // Do some unit of work
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多