异步/等待任务问题
本文关键字:问题 任务 等待 异步 | 更新日期: 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;
}
);
}