簡體   English   中英

異步/等待任務問題

[英]Async/await task issue

我有這段代碼,我想在后台運行,但是我做不到。 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;
            }
            );
    }

您沒有正確應用異步的概念。 將您的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;
        }
        );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM