Main에서 비동기 메서드를 어떻게 호출 할 수 있습니까?
public class test
{
public async Task Go()
{
await PrintAnswerToLife();
Console.WriteLine("done");
}
public async Task PrintAnswerToLife()
{
int answer = await GetAnswerToLife();
Console.WriteLine(answer);
}
public async Task<int> GetAnswerToLife()
{
await Task.Delay(5000);
int answer = 21 * 2;
return answer;
}
}
main () 메서드에서 Go를 호출하려면 어떻게해야합니까? 나는 C # 새로운 기능을 시도하고 있는데, 비동기 메서드를 이벤트에 연결할 수 있고 해당 이벤트를 트리거하여 비동기 메서드를 호출 할 수 있다는 것을 알고 있습니다.
하지만 메인 메서드에서 직접 호출하려면 어떻게해야합니까? 어떻게 할 수 있습니까?
나는 뭔가를했다
class Program
{
static void Main(string[] args)
{
test t = new test();
t.Go().GetAwaiter().OnCompleted(() =>
{
Console.WriteLine("finished");
});
Console.ReadKey();
}
}
그러나 그것은 데드 락이고 화면에 아무것도 인쇄되지 않는 것 같습니다.
귀하의 Main
방법을 단순화 할 수있다. C # 7.1 이상 :
static async Task Main(string[] args)
{
test t = new test();
await t.Go();
Console.WriteLine("finished");
Console.ReadKey();
}
이전 버전의 C # :
static void Main(string[] args)
{
test t = new test();
t.Go().Wait();
Console.WriteLine("finished");
Console.ReadKey();
}
이것은 async
키워드 (및 관련 기능) 의 아름다움의 일부입니다. 콜백의 사용 및 혼란스러운 특성이 크게 줄어들거나 제거됩니다.
Wait 대신 new test().Go().GetAwaiter().GetResult()
AggregateExceptions에 예외가 래핑되는 것을 방지하기 때문에 사용하는 것이 좋습니다 . 따라서 평소처럼 try catch (Exception ex) 블록으로 Go () 메서드를 둘러 쌀 수 있습니다.
C # v7.1 async
main
메서드 의 릴리스 이후 이미 게시 된 답변의 해결 방법이 필요하지 않도록 사용할 수있게되었습니다. 다음 서명이 추가되었습니다.
public static Task Main();
public static Task<int> Main();
public static Task Main(string[] args);
public static Task<int> Main(string[] args);
이렇게하면 다음과 같이 코드를 작성할 수 있습니다.
static async Task Main(string[] args)
{
await DoSomethingAsync();
}
static async Task DoSomethingAsync()
{
//...
}
class Program
{
static void Main(string[] args)
{
test t = new test();
Task.Run(async () => await t.Go());
}
}
반환 된 작업에서 결과 개체에 액세스하는 한 GetAwaiter를 전혀 사용할 필요가 없습니다 (결과에 액세스하는 경우에만 해당).
static async Task<String> sayHelloAsync(){
await Task.Delay(1000);
return "hello world";
}
static void main(string[] args){
var data = sayHelloAsync();
//implicitly waits for the result and makes synchronous call.
//no need for Console.ReadKey()
Console.Write(data.Result);
//synchronous call .. same as previous one
Console.Write(sayHelloAsync().GetAwaiter().GetResult());
}
작업이 완료 될 때까지 기다렸다가 추가 처리를 수행하려는 경우 :
sayHelloAsyn().GetAwaiter().OnCompleted(() => {
Console.Write("done" );
});
Console.ReadLine();
sayHelloAsync에서 결과를 얻고 추가 처리를 수행하는 데 관심이있는 경우 :
sayHelloAsync().ContinueWith(prev => {
//prev.Result should have "hello world"
Console.Write("done do further processing here .. here is the result from sayHelloAsync" + prev.Result);
});
Console.ReadLine();
함수를 기다리는 마지막 간단한 방법 :
static void main(string[] args){
sayHelloAsync().Wait();
Console.Read();
}
static async Task sayHelloAsync(){
await Task.Delay(1000);
Console.Write( "hello world");
}
public static void Main(string[] args)
{
var t = new test();
Task.Run(async () => { await t.Go();}).Wait();
}
.Wait () 사용
static void Main(string[] args){
SomeTaskManager someTaskManager = new SomeTaskManager();
Task<List<String>> task = Task.Run(() => marginaleNotesGenerationTask.Execute());
task.Wait();
List<String> r = task.Result;
}
public class SomeTaskManager
{
public async Task<List<String>> Execute() {
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:4000/");
client.DefaultRequestHeaders.Accept.Clear();
HttpContent httpContent = new StringContent(jsonEnvellope, Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage httpResponse = await client.PostAsync("", httpContent);
if (httpResponse.Content != null)
{
string responseContent = await httpResponse.Content.ReadAsStringAsync();
dynamic answer = JsonConvert.DeserializeObject(responseContent);
summaries = answer[0].ToObject<List<String>>();
}
}
}
ReferenceURL : https://stackoverflow.com/questions/13002507/how-can-i-call-an-async-method-in-main
'code' 카테고리의 다른 글
폴더가 비어있는 경우 Powershell 테스트 (0) | 2021.01.06 |
---|---|
콘솔 애플리케이션의 실행 디렉토리를 얻는 방법 (0) | 2021.01.06 |
Git이 이전 커밋을 승인 하시겠습니까? (0) | 2021.01.06 |
자바 : int [] 배열 대 int 배열 [] (0) | 2021.01.06 |
NotNull 또는 Nullable 가져 오기 및 Android Studio가 컴파일되지 않음 (0) | 2021.01.06 |