Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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# 使Task.Delay在调用线程上继续_C#_Task Parallel Library - Fatal编程技术网

C# 使Task.Delay在调用线程上继续

C# 使Task.Delay在调用线程上继续,c#,task-parallel-library,C#,Task Parallel Library,考虑这种方法: //Called on a known thread public async void ThreadSleep() { while(itemsInQueue) { //This call is currently on Thread X await Task.Delay(5000); //This needs to be on the thread that the method was cal

考虑这种方法:

//Called on a known thread
    public async void ThreadSleep()
    {
     while(itemsInQueue)
      {
        //This call is currently on Thread X
        await Task.Delay(5000);
       //This needs to be on the thread that the method was called on
        DoSomeProcessing();
       }
    }
我假设Task.Delay在另一个线程上异步执行,并在同一个线程上恢复。这对我来说不是很明显。如何使方法在线程X上继续

PS:ThreadSleep方法在非UI线程上执行

编辑:1)为了简单起见,添加了W.Brian的代码示例

2) 是的,这个例子就是。。。举个例子


3) Thread.Delay的目的只是在处理之间增加一些延迟。

您需要创建自己的同步上下文(就像UI线程那样)

介意我问你为什么要继续同一个话题吗? 通常,它不应该在使用新线程时创建和发布,因为上下文是保留的

如果需要在更深层次上保留调用之间的某种上下文(就像使用ThreadLocal一样),我建议您使用新的AsyncLocal来实现这一目标。 它确保即使线程被更改,不可变对象仍保留在异步上下文中(请参阅:)


调用
ConfigureAwait(true)
应该可以工作,因为即使线程发生更改,它也可以确保与原始线程相同的上下文。这假设未使用
ThreadLocal
,在这种情况下,async/await通常会导致问题和
Thread。如果无法更改其余代码,则最好使用Sleep

为什么要继续调用线程?@svick:为什么我不想?数据同步。可重入性问题。我可以想出很多理由来解释为什么对方法的调用需要在一个预先确定的线程上。通过正确返回
async Task
而不是
async void
,可以解决您列出的所有问题。如果我不正确,请你用一个例子更新你的问题,你需要它在同一个线程上(该线程不是UI线程)。好吧,它不修复这个人为的例子,它修复了数据同步和可重入性问题,尽管这是你告诉svick你为什么需要它。如果你可以发布一个你为什么需要它的真实例子,我可以发布一个答案,解释如何做到这一点,或者一个变通方法将如何实现同样的目标。我不能用你当前的例子来做这件事,因为我不知道
DoSomeProcessing()
背后的“为什么”每次都必须在同一个非UI线程上,如果我知道需求的原因,我就可以满足需求。@bobbyalex我已经否决了你的问题,因为你要求的东西通常是不好的做法,没有给出任何理由说明为什么在你的情况下这是有意义的。这也让你的问题听起来像是。如果你检查这个例子,你会发现每次while循环运行时,它都会在不同的线程上执行DoSomeProcessing,这是不可接受的。@bobbyalex:最初是正确的;但是,一旦您创建了“SingleThreadSynchronizationContext”并在run()方法中运行您的委托,该线程将专门保留给您自己的调度程序(本文底部的示例)。
await Task.Delay(5000).ConfigureAwait(true);