Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何初始化任务对象?_C#_.net_Styles_Code Readability - Fatal编程技术网

C# 如何初始化任务对象?

C# 如何初始化任务对象?,c#,.net,styles,code-readability,C#,.net,Styles,Code Readability,这个问题无关紧要,是为了可读性。我只想知道下面这行代码是否还有其他选择?代码的可读性和风格是否正确 Task newTask = new Task(() => { }); 编辑: 当满足特定条件/规则时,将创建此任务。在这种情况下,我会给这个类分配一个操作 if(condition Met && newTask.Status != TaskStatus.Running ) { newTask = Task.Factory.StartNew(Action); }

这个问题无关紧要,是为了可读性。我只想知道下面这行代码是否还有其他选择?代码的可读性和风格是否正确

Task newTask = new Task(() => { });
编辑:

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

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

谢谢

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

我建议只通过bool变量或任务变量本身跟踪任务是否正在运行,其中null值表示任务没有运行。例如:

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
    }
}

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

我建议只通过bool变量或任务变量本身跟踪任务是否正在运行,其中null值表示任务没有运行。例如:

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
    }
}

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