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

3
在我的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);吗?我看了看周围,但无法确定是否冗余,因为它已经在一个线程池线程中等待。


1
因为在您的情况下,执行连续的位置并不重要 - 您应该使用.ConfigureAwait(false) - 当您在循环中执行延迟时,这将更有效。 - Fabio
3个回答

8
我应该将它更改为await Task.Delay(300).ConfigureAwait(false);吗?我从周围看不出来,但听起来可能是多余的,因为它已经从线程池线程中等待了。

这是多余的,因为该方法一开始就没有上下文可以捕获。

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


1
调用异步任务时不要使用 await。
dispatcherTimer_Tick().DoNotAwait();

您的异步任务将每10秒运行一次,而不会干扰用户界面。您可以根据需要进行修改。通过使用这种方法,您的用户界面永远不会被卡住或挂起,并且它将永远运行。
private async Task dispatcherTimer_Tick()
{
    DispatcherTimer timer = new DispatcherTimer();
    TaskCompletionSource<bool> tcs = null;
    EventHandler tickHandler = (s, e) => tcs.TrySetResult(true);

    timer.Interval = TimeSpan.FromSeconds(10);
    timer.Tick += tickHandler;
    timer.Start();

    while (true)
    {
        tcs = new TaskCompletionSource<bool>();

        await Task.Run(() =>
        {
       // Run your background service and UI update here
        await tcs.Task;
    }

}

那么,您是否认为这种方法比我使用的方法更有优势呢?使用您的方法似乎可以更精确地控制时间。与我的方法“等待一秒钟,执行任务,再等待一秒钟”不同,您的方法是“每秒钟执行任务”。 - user1676558

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分钟调用一次,永远不会停止。

好的,这很有道理,但它似乎在做一些不同的事情。据我所知,这使用UI线程进行“//Do something”的操作,但我的代码将该处理保留在线程池线程上。 - user1676558

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接