Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.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# wp8的任务队列?_C#_Windows Phone 7_Windows Phone 8_Task_Dispatcher - Fatal编程技术网

C# wp8的任务队列?

C# wp8的任务队列?,c#,windows-phone-7,windows-phone-8,task,dispatcher,C#,Windows Phone 7,Windows Phone 8,Task,Dispatcher,在wp8中,对复杂任务进行排队的正确方法是什么 这些任务包括以下内容: 通过更新模型变量显示ProgressIndicator 获取或存储数据到wcf服务(UploadStringAsync) 使用UploadStringCompleted的结果更新潜在的数据绑定模型 通过更新模型变量隐藏ProgressIndicator 目前,我正在处理一个拥有命令对象队列的类,该类运行一个线程,该线程在添加一个尚未运行的项时启动 但是,我在等待代码停止运行的任务或子任务时遇到问题 以前我使用了async a

在wp8中,对复杂任务进行排队的正确方法是什么

这些任务包括以下内容:

  • 通过更新模型变量显示
    ProgressIndicator
  • 获取或存储数据到wcf服务(
    UploadStringAsync
  • 使用
    UploadStringCompleted
    的结果更新潜在的数据绑定模型
  • 通过更新模型变量隐藏
    ProgressIndicator
  • 目前,我正在处理一个拥有命令对象队列的类,该类运行一个线程,该线程在添加一个尚未运行的项时启动

    但是,我在等待代码停止运行的任务或子任务时遇到问题

    以前我使用了async await,但是在一些级别上,这种行为变得越来越不可预测

    我想要的是主线程能够创建和排队命令对象。 命令对象应该一次运行一个,直到前一个对象完全完成后才开始新的对象。
    必要时,命令对象应该能够使用调度程序访问主线程。

    如果使用
    async
    /
    wait
    ,则不需要另一个线程(因为您没有CPU限制的处理)

    在您的情况下,听起来您只需要一个异步委托队列。异步委托的自然类型是
    Func
    (不带返回值)或
    Func
    (带返回值)。不幸的是,这个小提示目前还不为人所知

    因此,声明一个异步委托队列:

    private readonly Queue<Func<Task>> queue = new Queue<Func<Task>>();
    
    只要没有更多项目,
    queueProcessor
    就可以为
    null
    。无论何时它不是
    null
    ,它都将表示此方法:

    private async Task ProcessQueue()
    {
      try
      {
        while (queue.Count != 0)
        {
          Func<Task> command = queue.Dequeue();
          try
          {
            await command();
          }
          catch (Exception ex)
          {
            // Exceptions from your queued tasks will end up here.
            throw;
          }
        }
      }
      finally
      {
        queueProcessor = null;
      }
    }
    
    现在,我将异常处理设置为这样:任何引发异常的排队命令都会导致队列处理器停止处理(具有相同的异常)。这可能不是应用程序的最佳行为

    您可以这样使用它(当然可以使用lambda或实际方法):

    请注意使用的
    下载StringTaskAsync
    。如果您愿意,您的
    async
    代码将更“自然”(即更简单)


    这非常复杂,我建议将其放入一个单独的类中,但您需要先决定如何处理(和表面化)错误。

    如果使用
    async
    /
    wait
    ,则不需要另一个线程(因为您没有CPU绑定的处理)

    在您的情况下,听起来您只需要一个异步委托队列。异步委托的自然类型是
    Func
    (不带返回值)或
    Func
    (带返回值)。不幸的是,这个小提示目前还不为人所知

    因此,声明一个异步委托队列:

    private readonly Queue<Func<Task>> queue = new Queue<Func<Task>>();
    
    只要没有更多项目,
    queueProcessor
    就可以为
    null
    。无论何时它不是
    null
    ,它都将表示此方法:

    private async Task ProcessQueue()
    {
      try
      {
        while (queue.Count != 0)
        {
          Func<Task> command = queue.Dequeue();
          try
          {
            await command();
          }
          catch (Exception ex)
          {
            // Exceptions from your queued tasks will end up here.
            throw;
          }
        }
      }
      finally
      {
        queueProcessor = null;
      }
    }
    
    现在,我将异常处理设置为这样:任何引发异常的排队命令都会导致队列处理器停止处理(具有相同的异常)。这可能不是应用程序的最佳行为

    您可以这样使用它(当然可以使用lambda或实际方法):

    请注意使用的
    下载StringTaskAsync
    。如果您愿意,您的
    async
    代码将更“自然”(即更简单)


    这非常复杂,我建议将其放在一个单独的类中,但您需要决定如何处理(和表面)首先出错。

    阻塞集合
    阻塞集合
    ?我想知道如果我在足够的暂停时间内调用Enqueue两次,以便第一个命令已经出列并等待,会发生什么情况。很好!签入
    排队
    应为
    队列处理器
    ,而不是
    队列.计数
    。我已经更新了答案中的代码。我正在尝试使用这种类型的工作队列实现暂停/恢复,以便在应用程序关闭时,我可以暂停并保留到DB,或者允许用户有机会等待,从而恢复处理。不过,我很难让它正常工作。取消是命中和未命中的,并且恢复_queueprocessor=ProcessQueue()不像在Enqueue()中那样工作。很高兴听到其他人会怎么做?我想知道如果我调用Enqueue两次并有足够的暂停时间,以便第一个命令已经出列并等待,会发生什么情况。很好!签入
    排队
    应为
    队列处理器
    ,而不是
    队列.计数
    。我已经更新了答案中的代码。我正在尝试使用这种类型的工作队列实现暂停/恢复,以便在应用程序关闭时,我可以暂停并保留到DB,或者允许用户有机会等待,从而恢复处理。不过,我很难让它正常工作。取消是命中和未命中的,并且恢复_queueprocessor=ProcessQueue()不像在Enqueue()中那样工作。听到别人会怎么做会很好吗?
    Enqueue(async () =>
    {
      ShowProgressIndicator = true;
      ModelData = await myProxy.DownloadStringTaskAsync();
      ShowProgressIndicator = false;
    });