是否确保对同一任务恢复多个等待表达式的顺序?

弗朗西斯科·内托(Francisco Neto)

我正在学习使用C#4.5进行异步/等待,并想知道当多个“等待者”正在等待同一任务时会发生什么。

我正在做一些实验,我想我了解发生了什么。但是,我有一些问题要问:

看一下这段代码:

AsyncAwaitExperiment.fxml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace View
{
    /// <summary>
    /// Interaction logic for AsyncAwaitExperiment.xaml
    /// </summary>
    public partial class AsyncAwaitExperiment : Window
    {

        private CancellationTokenSource token;
        private Task longRunningTask;

        public AsyncAwaitExperiment()
        {
            InitializeComponent();
        }

        private void startAsyncOperation(object sender, RoutedEventArgs e)
        {
            if (longRunningTask != null && !longRunningTask.IsCompleted)
            {
                return;
            }
            else
            {
                longRunningTask = null;
                token = new CancellationTokenSource();
            }

            Action action = () => 
            {
                while (!token.Token.IsCancellationRequested)
                {
                    Thread.Sleep(100);
                }
            };

            longRunningTask = Task.Factory.StartNew(
                action,
                token.Token, 
                TaskCreationOptions.LongRunning,
                TaskScheduler.Current);
        }

        private void stopOperation(object sender, RoutedEventArgs e)
        {
            if (longRunningTask == null
                || longRunningTask.IsCompleted
                || token == null
                || token.Token.IsCancellationRequested)
            {
                return;
            }
            token.Cancel();
        }

        private async void firstAwait(object sender, RoutedEventArgs e)
        {
            if (longRunningTask == null || longRunningTask.IsCompleted)
                return;
            await longRunningTask;
            Console.WriteLine("First Method");
        }

        private async void secondAwait(object sender, RoutedEventArgs e)
        {
            if (longRunningTask == null || longRunningTask.IsCompleted)
                return;
            await longRunningTask;
            Console.WriteLine("Second Method");
        }
    }
}

AsyncAwaitExperiment.fxml

<Window x:Class="View.AsyncAwaitExperiment"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="AsyncAwaitExperiment" Height="300" Width="300">
    <Grid>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
            <Button Content="Start Async" Margin="3" Click="startAsyncOperation" />
            <Button Content="Stop Async" Margin="3" Click="stopOperation" />
            <Button Content="Await First" Margin="3" Click="firstAwait" />
            <Button Content="Await Second" Margin="3" Click="secondAwait" />
        </StackPanel>
    </Grid>
</Window>

此代码的行为是:

  1. 当按下“开始”按钮时,开始异步长时间运行操作。
  2. 当按下“停止”按钮时,停止异步操作。
  3. 当按下“第一次等待”按钮时,等待任务完成,然后在控制台上打印一些内容。
  4. 与第二个按钮相同(“第二个等待”)。

通过这段代码和一些断点,我注意到了一些行为。

  1. 当我等待任务时,它将在先前已停止的位置恢复代码。我猜这里没什么新鲜的。
  2. 如果(这是有趣的部分)我为同一任务有多个“等待者”,则它将按等待的代码的相同顺序恢复。例如:如果首先单击了firstAwait,然后单击了secondAwait,则当任务完成时,代码流的恢复将遵循相同的顺序:先等待,然后再等待。

问题是:

  1. 是否可以保证这种行为(关于简历的顺序)?
  2. 使用此调度程序(TaskScheduler.Current)是否有任何问题?
  3. 我可以重用取消令牌吗,还是每次取消并启动任务时都真的需要创建一个吗?

PS:对不起,我的英语不好:/

Damien_The_Unbeliever

您不应对活动的恢复顺序承担任何责任。假设将来有人设法编写一个完全是多线程的新UI系统,那么您甚至期望UI线程可以并行运行(注意:没有人认为编写多线程UI系统是理智的。当前;即使“同时”恢复执行两个任务,也可能会无限期地暂停其中一项)

如果活动之间的依赖关系在你的代码,使他们明确。否则,假设它们可能以任何顺序发生并且可能被交错。那是编程的唯一理智的方法。

最后,没有。一旦使用过CancellationToken,就完成了。如果需要另一个,则需要创建一个新的。实际上,这使考虑多个任务/活动变得更容易考虑-从取消令牌到取消令牌都不可能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何确认同一任务是否在多个服务器实例上完成

来自分类Dev

在VS Code中运行同一任务的多个实例

来自分类Dev

对同一主机的同一任务的多个同时请求显示“无法将数据发送到远程主机IP。请确保可以通过ssh访问此主机

来自分类Dev

定期运行同一任务时清除先前的celery任务redis结果

来自分类Dev

在gradle中执行期间多次运行同一任务

来自分类Dev

Winservice-计时器:并行执行同一任务

来自分类Dev

如何将相同的键用于同一任务(鼠标输入)

来自分类Dev

Ansible:循环复杂变量以访问同一任务下的不同层的方法

来自分类Dev

具有800W PSU的功能强大的Core i7 PC是否比在同一任务上的性能较弱的PC消耗更多的功率?

来自分类Dev

在ADF上以编程方式重定向到同一任务流上的另一个视图

来自分类Dev

Spark join总是停留在同一任务上,我该如何调试?

来自分类Dev

如何在AWS ECS中执行同一任务的容器之间进行通信?

来自分类Dev

解决同一任务的两种算法之间的显着运行时间差异

来自分类Dev

如何使用Rabbitmq在nodejs中设计一个任务调度程序,该任务调度程序在跨多个进程时将不会运行同一任务?

来自分类Dev

无法使用awsvpc网络类型与ECS Fargate上同一任务内的另一个容器通信

来自分类Dev

具有唯一任务的线程池队列

来自分类Dev

如何使代码有效-USACO培训第一任务

来自分类Dev

当两个容器都在ECS Fargate中的同一任务中运行时,如何从我的UI向我的API发出请求

来自分类Dev

为什么终端快捷方式与其他地方用于同一任务的快捷方式不同?

来自分类Dev

一个线程中是否有多个等待以相同的任务按FIFO顺序恢复?

来自分类Dev

是否在或表达式中保证顺序

来自分类Dev

UseDotNet @ 2任务是否安装主机捆绑包?

来自分类Dev

在同一表达式内的表达式中使用副作用的结果是否安全?

来自分类Dev

如何使KDE 5任务栏像Windows 7任务栏一样工作?

来自分类Dev

sed具有多个表达式是否与一个带有分号的表达式相同?

来自分类Dev

是否有一个正则表达式可以按顺序查找字符?

来自分类Dev

NSPredicate正则表达式匹配同一属性上的多个段

来自分类Dev

使用正则表达式在同一行上查找多个匹配项

来自分类Dev

在Java正则表达式中捕获同一组的多个实例

Related 相关文章

  1. 1

    如何确认同一任务是否在多个服务器实例上完成

  2. 2

    在VS Code中运行同一任务的多个实例

  3. 3

    对同一主机的同一任务的多个同时请求显示“无法将数据发送到远程主机IP。请确保可以通过ssh访问此主机

  4. 4

    定期运行同一任务时清除先前的celery任务redis结果

  5. 5

    在gradle中执行期间多次运行同一任务

  6. 6

    Winservice-计时器:并行执行同一任务

  7. 7

    如何将相同的键用于同一任务(鼠标输入)

  8. 8

    Ansible:循环复杂变量以访问同一任务下的不同层的方法

  9. 9

    具有800W PSU的功能强大的Core i7 PC是否比在同一任务上的性能较弱的PC消耗更多的功率?

  10. 10

    在ADF上以编程方式重定向到同一任务流上的另一个视图

  11. 11

    Spark join总是停留在同一任务上,我该如何调试?

  12. 12

    如何在AWS ECS中执行同一任务的容器之间进行通信?

  13. 13

    解决同一任务的两种算法之间的显着运行时间差异

  14. 14

    如何使用Rabbitmq在nodejs中设计一个任务调度程序,该任务调度程序在跨多个进程时将不会运行同一任务?

  15. 15

    无法使用awsvpc网络类型与ECS Fargate上同一任务内的另一个容器通信

  16. 16

    具有唯一任务的线程池队列

  17. 17

    如何使代码有效-USACO培训第一任务

  18. 18

    当两个容器都在ECS Fargate中的同一任务中运行时,如何从我的UI向我的API发出请求

  19. 19

    为什么终端快捷方式与其他地方用于同一任务的快捷方式不同?

  20. 20

    一个线程中是否有多个等待以相同的任务按FIFO顺序恢复?

  21. 21

    是否在或表达式中保证顺序

  22. 22

    UseDotNet @ 2任务是否安装主机捆绑包?

  23. 23

    在同一表达式内的表达式中使用副作用的结果是否安全?

  24. 24

    如何使KDE 5任务栏像Windows 7任务栏一样工作?

  25. 25

    sed具有多个表达式是否与一个带有分号的表达式相同?

  26. 26

    是否有一个正则表达式可以按顺序查找字符?

  27. 27

    NSPredicate正则表达式匹配同一属性上的多个段

  28. 28

    使用正则表达式在同一行上查找多个匹配项

  29. 29

    在Java正则表达式中捕获同一组的多个实例

热门标签

归档