我应该在Task.Run操作中的Task.Delay上使用ConfigureAwait(false)吗?

时间:2017-03-27 04:06:19

标签: c# .net wpf task

在我的WPF MVVM应用程序中,我有一些永远运行的后台任务,我这样创建:

Task.Run(async () =>
{
    while (true)
    {
        if (IsStarted)
        {
            // Do some processing and update the UI via bound properties.
        }

        await Task.Delay(300);
    }
});

我应该将其更改为await Task.Delay(300).ConfigureAwait(false);吗?我无法从四处看看,但听起来它可能是多余的,因为它已经从线程池线程中等待。

3 个答案:

答案 0 :(得分:3)

  

我应该将其更改为等待Task.Delay(300).ConfigureAwait(false);?我无法从四处看看,但听起来它可能是多余的,因为它已经从线程池线程中等待。

这将是多余的,因为该方法首先没有要捕获的上下文。

然而,作为一种风格偏好,我仍然会使用它。 ConfigureAwait(false)的存在向读者通知该方法的其余部分不需要在其原始上下文中恢复。

答案 1 :(得分:1)

使用“不等待”调用异步任务。

mockStatic(StringUtils.class);
when(StringUtils.isEmpty("")).thenReturn(false);
/*Is it possible to make this behaviour run only once such that second time
when it is called we can mock it again.*/
limitStaticMock(times(1));//Is this possible?
when(StringUtils.isEmpty("")).thenReturn(true);//Setting behaviour again.

您的异步任务将每10秒运行一次,而不会分配UI。您可以根据需要进行修改。通过这种方法,您的UI永远不会被敲击或挂起,它将永远运行。

dispatcherTimer_Tick().DoNotAwait();

答案 2 :(得分:0)

您可以通过DispatcherTimer课程来实现。

首先,您需要按照以下方式初始化该类。

DispatcherTimer myBackGroundProcess=new DispatcherTimer();

现在您需要将事件注册到您的DispatcherTimer对象。

myBackGroundProcess.Tick += new EventHandler(myBackGroundProcess_Tick);
myBackGroundProcess.Interval = new TimeSpan(0, 2, 0);
myBackGroundProcess.Start();

TimeSpan中你可以提及你的方法来调用你的方法,它需要参数(小时,分钟,秒)。

最后,您需要编写一个已注册DispatcherTimer对象的方法。

public void myBackGroundProcess_Tick()
{
     //Do Something
}

因此,在我的代码中,我的方法myBackGroundProcess_Tick()将在每2分钟后永远调用一次。