C# 异步/等待任务问题
我有这段代码,我想在后台运行,但我做不到。GUI被冻结到最后。错误是什么?不管怎样,我试过了,但我还是试过。我有可以工作的代码,但不适用于这个示例:S ThxC# 异步/等待任务问题,c#,wpf,async-await,C#,Wpf,Async Await,我有这段代码,我想在后台运行,但我做不到。GUI被冻结到最后。错误是什么?不管怎样,我试过了,但我还是试过。我有可以工作的代码,但不适用于这个示例:S Thx private RelayCommand _jugarCommand; public RelayCommand JugarCommand { get { return _jugarCommand ?? (_jugarCommand
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;
}
);
}
private RelayCommand\u jugarCommand;
公共关系社区JugarCommand
{
收到
{
返回_jugarCommand??
(_jugarCommand)=
新RelayCommand(Jugar,
()=>CantidadDeSimulaciones!=null&&Regex.IsMatch(CantidadDeSimulaciones,@“^\d+$”);
}
}
私有异步void Jugar()
{
Jugadas=等待计算Jugadas();
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;
}
私有任务CalcularJugadas()
{
返回任务。运行(
() =>
{
var calcularJugadas=新的可观测集合();
var numerioaleatorio=新随机数();
对于(var iIndex=1;iIndex您没有正确应用异步的概念。请先将您的CalcularJugadas更改为异步
另外,您可能需要更改任务。运行到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;
}
);
}
专用异步任务CalcularJugadas()
{
return wait TaskFactory.StartNew(
() =>
{
var calcularJugadas=新的可观测集合();
var numerioaleatorio=新随机数();
对于(var iIndex=1;iIndex Hi@avechuche),您是否可以尝试将Jugar方法的返回改为Task而不是void,并将RelayCommand实例改为“new RelayCommand(async()=>await Jugar(),…”?也可以将CalcularJugadas标记为async?