wpf 비동기 Thread 작업

Eden·2023년 2월 16일
0

wpf에서 특정 함수 작업량이 많아지면 해당 함수가 끝날때 까지 UI Freeze가 일어나 sw 동작에 부자연스러운 부분이 생긴다. 따라서 UI를 직접적으로 바꾸는 함수가 아닐 경우 별도의 Thread에서 비동기식으로 작업해야할 필요가 있었다.

this.cmdanalisis = new Command()
            {
                DoAction = () =>
                {
                	try
                    {
                    	AnalisisSomething(); //실제 오래걸리는 작업
					}
                    catch
                    {
                    
                    }

                }
             }
private async Task AnalisisSomething() //전역변수 사용가능 
{
	Task Task1 = first_Analsis();
    await Task1; // Task1이 종료될때까지 기다림
    
}



private async Task first_Analsis() 
{ 
    //여기까지 전역변수 사용 가능
	await Task.Run(() =>  // 문제 부분
    {
    	Function();
    });
    
    
    (End Function~) 
    

}

public void Function()
{
	
}

문제 부분에서 경우에 따라 전역변수를 건들이면 해당 비동기 쓰레드가 종료되는 문제가 있었다. 때문에 문제부분의 쓰레드에 리턴값을 받아와 전역변수를 사용 가능한 부분에서 리턴값을 넘겨주도록 하였다.

string TaskValue  = "";

private async Task AnalisisSomething() //전역변수 사용가능 
{
	Task<string> Task1 = first_Analsis();
    await Task1; // Task1이 종료될때까지 기다림
    
    
    TaskValue = Task1.Result;
}



private async Task<string> first_Analsis() 
{ 
    //여기까지 전역변수 사용 가능
    string Value = "";
	await Task.Run(() =>  // 문제 부분
    {
    	Function(ref Value);
    });
    
    return Value;
    
    

}

public void Function(ref string val)
{
	val += "result";
}

아직 어정쩡하게 알고 사용중이며 정확히 이해해야함

profile
주섬주섬..

0개의 댓글