Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.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“任务”;“饰面”;正在执行任务。延迟?(温特)_C#_Windows Runtime_Task_Delay_Async Await - Fatal编程技术网

C# C“任务”;“饰面”;正在执行任务。延迟?(温特)

C# C“任务”;“饰面”;正在执行任务。延迟?(温特),c#,windows-runtime,task,delay,async-await,C#,Windows Runtime,Task,Delay,Async Await,我在tasks和Task.Factory中遇到了这种特殊情况。这是我的代码 public Task CreateAndStartSyncTask() { return Task.Factory.StartNew(async () => { ... do stuff ... await Task.Delay(500); ... do more stuff ... } } public void Synchronize(

我在tasks和Task.Factory中遇到了这种特殊情况。这是我的代码

public Task CreateAndStartSyncTask()
{
    return Task.Factory.StartNew(async () =>
    {
        ... do stuff ...
        await Task.Delay(500);
        ... do more stuff ...
    }
}

public void Synchronize()
{
    var syncTask = CreateAndStartSyncTask();
    syncTask.Wait(mTimeout);

    switch(syncTask.Status) {
        case TaskStatus.RanToCompletion:
            // VICTORY!
            break;
        default:
            throw syncTask.Exception;
    }
}
所以这里我的问题是,当我运行这段光荣的代码时,我会在“…做更多的事情…”之前进入开关箱。然后任务继续运行,直到完成。这不是我想要的功能,因为我更希望任务能够完成

也就是说,在这个特定的上下文中,将它放在自己的任务中是有点多余的,因为它是以同步的方式处理的,但是我不能完全公开代码,我真的需要理解整个任务完成的心态


有什么事吗?我怎样才能真正检查一项任务是否真的结束了?

不要使用
task.Factory.StartNew
。使用
任务。改为运行
。两者都有详细描述这一点的博客文章

总之,
StartNew
不理解
async
方法。它返回的
任务
仅表示方法的第一个同步部分。要使用
StartNew
,您必须调用
Unwrap
或执行双重
wait
。最好使用
Task.Run
,它可以理解
async
方法


此外,您不希望阻止
异步
任务(即
同步
中的
等待
)。相反,你应该等待他们。如果你阻止它们,你很容易就会遇到我在博客上描述的问题。

不要使用
Task.Factory.StartNew
。使用
任务。改为运行
。两者都有详细描述这一点的博客文章

总之,
StartNew
不理解
async
方法。它返回的
任务
仅表示方法的第一个同步部分。要使用
StartNew
,您必须调用
Unwrap
或执行双重
wait
。最好使用
Task.Run
,它可以理解
async
方法


此外,您不希望阻止
异步
任务(即
同步
中的
等待
)。相反,你应该等待他们。如果你阻止它们,你很容易就会遇到我在我的博客上描述的问题。

mTimeout的值是多少?
当你替换
等待任务时,你会得到什么。延迟(500)带有
任务。延迟(500)。等待()mTimeout大约为10.000。任务。延迟(x)。等待();似乎解决了这个问题。我仍然想知道任务背后的逻辑是什么。延迟将任务的“IsCompleted”设置为true是什么?mTimeout的值是多少?
替换等待任务时得到什么。延迟(500)带有
任务。延迟(500)。等待()mTimeout大约为10.000。任务。延迟(x)。等待();似乎解决了这个问题。我仍然想知道任务背后的逻辑是什么。延迟将任务的“IsCompleted”设置为true是什么?这就澄清了它!谢谢这就清楚了!谢谢