在我的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);
吗?我无法从四处看看,但听起来它可能是多余的,因为它已经从线程池线程中等待。
答案 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分钟后永远调用一次。