Visual C# で非同期処理(async/await)を複数動かすとUIがフリーズする
初めまして、現在C#にて非同期処理を使ったプログラムを作成しています。
経緯として、ある外部機器のメモリ空間に、一定の値を連続して書き込むものを作りたいと考えました。
その項目にチェックボックスを入れると、チェック中はasync/awaitを利用し、非同期処理で書き込む処理を続ける、というものを作りました。
ですが、同じ構造のものを複数作り、3つほどチェックを入れると、UIがフリーズしてしまいます。
メモリへの書き込みは出来ているため、アプリケーションは落ちていないようです。
UIが固まるのはどういった原因が考えられるのでしょうか。
#region Always UAV
private async void kpUAV_CheckedChanged( object sender , EventArgs e )
{
if ( kpUAV.Checked )
{
while ( kpUAV.Checked )
{
ulong targetClient = 0x21A8164 + (0x17010 * (ulong)kpSelectClient.Value ) ;
PS4.WriteMemory( this.processID , targetClient + 0x714 , new byte[]{ 0x01 } ) ; // UAV1
PS4.WriteMemory( this.processID , targetClient + 0xBC74 , new byte[]{ 0x01 } ) ; // UAV2
PS4.WriteMemory( this.processID , targetClient + 0x16F9C , new byte[]{ 0x01 } ) ; // UAV3
await Task.Run( ( ) => { Thread.Sleep( 150 ) ; } ) ;
}
}
else
{
ulong targetClient = 0x21A8164 + (0x17010 * (ulong)kpSelectClient.Value ) ;
PS4.WriteMemory( this.processID , targetClient + 0x714 , new byte[]{ 0x00 } ) ; // UAV1
PS4.WriteMemory( this.processID , targetClient + 0xBC74 , new byte[]{ 0x00 } ) ; // UAV2
PS4.WriteMemory( this.processID , targetClient + 0x16F9C , new byte[]{ 0x00 } ) ; // UAV3
}
}
#endregion
#region Always VSAT
private async void kpVSAT_CheckedChanged( object sender , EventArgs e )
{
if ( kpVSAT.Checked )
{
while ( kpVSAT.Checked )
{
ulong targetClient = 0x21A8164 + (0x17010 * (ulong)kpSelectClient.Value ) ;
PS4.WriteMemory( this.processID , targetClient + 0x718 , new byte[]{ 0x01 } ) ; // VSAT1
PS4.WriteMemory( this.processID , targetClient + 0xBC78 , new byte[]{ 0x01 } ) ; // VSAT2
PS4.WriteMemory( this.processID , targetClient + 0x16FA0 , new byte[]{ 0x01 } ) ; // VSAT3
await Task.Run( ( ) => { Thread.Sleep( 150 ) ; } ) ;
}
}
else
{
ulong targetClient = 0x21A8164 + (0x17010 * (ulong)kpSelectClient.Value ) ;
PS4.WriteMemory( this.processID , targetClient + 0x718 , new byte[]{ 0x00 } ) ; // VSAT1
PS4.WriteMemory( this.processID , targetClient + 0xBC78 , new byte[]{ 0x00 } ) ; // VSAT2
PS4.WriteMemory( this.processID , targetClient + 0x16FA0 , new byte[]{ 0x00 } ) ; // VSAT3
}
}
#endregion
#region Laser locator
private async void kpLaserLocator_CheckedChanged( object sender , EventArgs e )
{
if ( kpLaserLocator.Checked )
{
while ( kpLaserLocator.Checked )
{
ulong targetClient = 0x21A8164 + (0x17010 * (ulong)kpSelectClient.Value ) ;
PS4.WriteMemory( this.processID , targetClient + 0x782 , new byte[]{ 0x01 } ) ; // Point laser1
PS4.WriteMemory( this.processID , targetClient + 0xBCE2 , new byte[]{ 0x01 } ) ; // Point laser2
PS4.WriteMemory( this.processID , targetClient + 0x17740 , new byte[]{ 0x01 } ) ; // Point laser3
await Task.Run( ( ) => { Thread.Sleep( 150 ) ; } ) ;
}
}
else
{
ulong targetClient = 0x21A8164 + (0x17010 * (ulong)kpSelectClient.Value ) ;
PS4.WriteMemory( this.processID , targetClient + 0x782 , new byte[]{ 0x00 } ) ; // Point laser1
PS4.WriteMemory( this.processID , targetClient + 0xBCE2 , new byte[]{ 0x00 } ) ; // Point laser2
PS4.WriteMemory( this.processID , targetClient + 0x17740 , new byte[]{ 0x00 } ) ; // Point laser3
}
}
#endregion