2015-06-14 209 views
1

我有这段代码,我想在后台运行,但我做不到。 GUI被冻结直到结束。什么是错误?无论如何,我仍然试过,但我仍然这样做。我有代码可行,但不适用于此示例:S Thx!异步/等待任务问题

private RelayCommand _jugarCommand; 
    public RelayCommand JugarCommand 
    { 
     get 
     { 
      return _jugarCommand ?? 
        (_jugarCommand = 
         new RelayCommand(Jugar, 
          () => CantidadDeSimulaciones != null && Regex.IsMatch(CantidadDeSimulaciones, @"^\d+$"))); 
     } 
    } 



private async void Jugar() 
    { 

     Jugadas = await CalcularJugadas(); 

     GanoA += Jugadas.Count(x => x.QuienGano == "JUGADOR A"); 
     GanoB += Jugadas.Count(x => x.QuienGano == "JUGADOR B"); 
     Empate += Jugadas.Count(x => x.QuienGano == "EMPATE"); 
     JugadasAcumuladas += 1; 

    } 

    private Task<ObservableCollection<Jugada>> CalcularJugadas() 
    { 

     return Task.Run(
      () => 
      { 
       var calcularJugadas = new ObservableCollection<Jugada>(); 

       var numeroAleatorio = new Random(); 

       for (var iIndex = 1; iIndex <= Convert.ToInt16(CantidadDeSimulaciones); iIndex++) 
       { 

        var randomNumberA = numeroAleatorio.NextDouble(); 
        var randomNumberB = numeroAleatorio.NextDouble(); 
        var queEligioA = QueEligio(randomNumberA).ToString(); 
        var queEligioB = QueEligio(randomNumberB).ToString(); 

        var nuevoJuegada = new Jugada 
        { 
         ID = iIndex, 
         NumeroAleatorioA = randomNumberA, 
         NumeroAleatorioB = randomNumberB, 
         JugadorA = new Jugador 
         { 
          QueEligio = queEligioA 
         }, 
         JugadorB = new Jugador 
         { 
          QueEligio = queEligioB 
         }, 
         QuienGano = QuienGano(queEligioA, queEligioB) 
        }; 

        calcularJugadas.Add(nuevoJuegada); 
       } 

       return calcularJugadas; 
      } 
      ); 
    } 
+0

嗨@avechuche,你可以尝试改变返回JUGAR方法来工作,而不是无效,改变RelayCommand实例,以“新RelayCommand(异步()=>等待JUGAR( ),...“?也许将CalcularJugadas标记为异步? –

回答

-2

你不是在申请异步的概念正常。首先将您的CalcularJugadas更改为异步。

此外,您可能需要将Task.Run更改为TaskFactory.StartNew以获得更好的多线程。 (请注意,startnew是可等待的)。你的函数看起来就像这样:

private async Task<ObservableCollection<Jugada>> CalcularJugadas() 
{ 

    return await TaskFactory.StartNew(
     () => 
     { 
      var calcularJugadas = new ObservableCollection<Jugada>(); 

      var numeroAleatorio = new Random(); 

      for (var iIndex = 1; iIndex <= Convert.ToInt16(CantidadDeSimulaciones); iIndex++) 
      { 

       var randomNumberA = numeroAleatorio.NextDouble(); 
       var randomNumberB = numeroAleatorio.NextDouble(); 
       var queEligioA = QueEligio(randomNumberA).ToString(); 
       var queEligioB = QueEligio(randomNumberB).ToString(); 

       var nuevoJuegada = new Jugada 
       { 
        ID = iIndex, 
        NumeroAleatorioA = randomNumberA, 
        NumeroAleatorioB = randomNumberB, 
        JugadorA = new Jugador 
        { 
         QueEligio = queEligioA 
        }, 
        JugadorB = new Jugador 
        { 
         QueEligio = queEligioB 
        }, 
        QuienGano = QuienGano(queEligioA, queEligioB) 
       }; 

       calcularJugadas.Add(nuevoJuegada); 
      } 

      return calcularJugadas; 
     } 
     ); 
}