암시 적으로 'string'형식을 'System.Threading.Tasks.Task로 변환 할 수 없습니다.'
저는 비동기 프로그래밍을 처음 사용하므로 비동기 샘플 코드를 살펴본 후 간단한 비동기 코드를 작성하려고 생각했습니다.
간단한 Winform 응용 프로그램을 만들고 Form 내부에 다음 코드를 작성했습니다. 하지만 작동하지 않습니다
private Task<string> methodAsync() {
Thread.Sleep(10000);
return "Hello"; //Error: Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task<string>'
}
private async void button1_Click(object sender, EventArgs e)
{
string s = await methodAsync();
MessageBox.Show(s);
}
여기에 불 좀 켜주 시겠어요 ..
나열된 메서드 반환 유형은입니다 Task<string>
. 을 반환하려고합니다 string
. 그들은 동일하지 않으며 문자열에서 로의 암시 적 변환이 없으므로 Task<string>
오류가 발생합니다.
컴파일러에 의해 async
반환 값이 자동으로 래핑되는 메서드 와 혼동 될 수 Task
있습니다. 현재이 메서드는 비동기 메서드가 아닙니다. 당신은 거의 확실하게 이것을하려고했습니다.
private async Task<string> methodAsync()
{
await Task.Delay(10000);
return "Hello";
}
두 가지 주요 변경 사항이 있습니다. 먼저 메서드가로 표시됩니다 async
. 즉, 반환 형식이로 래핑되어 Task
메서드가 컴파일됩니다. 다음으로, 우리는 차단 대기를 원하지 않습니다. 일반적으로 await
모델을 사용할 때 가능한 경우 대기 차단을 항상 피하십시오. Task.Delay
지정된 시간 (밀리 초) 후에 완료 될 작업입니다. await
그 작업 을 -ing 함으로써 우리는 그 시간 동안 비 차단 대기를 효과적으로 수행하고 있습니다 (실제로 메서드의 나머지는 해당 작업의 연속입니다).
를 사용하지 않고 4.0 방식을 선호한다면 다음 await
과 같이 할 수 있습니다.
private Task<string> methodAsync()
{
return Task.Delay(10000)
.ContinueWith(t => "Hello");
}
첫 번째 버전은 이와 거의 비슷한 것으로 컴파일되지만, await
여기에서 활용하지 않는 오류 처리 및 기타 기능을 지원하기위한 추가 상용구 코드가 있습니다.
당신이 경우 Thread.Sleep(10000)
정말 잠시 동안 기다리고 단지 방식에 반대 다만, 일부 장기 실행 방법에 대한 자리가 될하기위한 것입니다, 당신은 대신 현재 컨텍스트의, 작업이 다른 스레드에서 수행되어 있는지 확인해야합니다. 가장 쉬운 방법은 Task.Run
다음과 같습니다.
private Task<string> methodAsync()
{
return Task.Run(()=>
{
SomeLongRunningMethod();
return "Hello";
});
}
또는 더 가능성 :
private Task<string> methodAsync()
{
return Task.Run(()=>
{
return SomeLongRunningMethodThatReturnsAString();
});
}
FromResult 메서드 사용
public async Task<string> GetString()
{
System.Threading.Thread.Sleep(5000);
return await Task.FromResult("Hello");
}
의 문제가 사용 넘어 async
@Servy에 의해 지적, 다른 문제는 명시 적으로 얻을 필요가있다 T
에서 Task<T>
Task.Result를 호출. Result 속성은 비동기 코드를 차단하므로주의해서 사용해야합니다.
시험:
private async void button1_Click(object sender, EventArgs e)
{
var s = await methodAsync();
MessageBox.Show(s.Result);
}
'program tip' 카테고리의 다른 글
메모장 ++에서 현재 줄을 삭제하고 새 줄을 추가하는 방법은 무엇입니까? (0) | 2020.12.15 |
---|---|
사용자 지정 .php 파일에 WordPress 기능을 포함하는 방법은 무엇입니까? (0) | 2020.12.15 |
Laravel이 블레이드 템플릿의 모든 HTML을 이스케이프 (0) | 2020.12.14 |
누락 된 문자가있는 단어를 찾기위한 좋은 알고리즘 및 데이터 구조? (0) | 2020.12.14 |
SO_REUSEADDR (setsockopt 옵션)-Linux의 의미는 무엇입니까? (0) | 2020.12.14 |