异步/等待任务问题

本文关键字:问题 任务 等待 异步 | 更新日期: 2023-09-27 17:56:04

我有这段代码,我想在后台运行,但我做不到。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;
            }
            );
    }

异步/等待任务问题

您没有正确应用异步的概念。首先将钙状体更改为异步。

此外,您可能希望将 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;
        }
        );
}