2014-10-19 3 views
2

비동기/대기와 함께 몇 가지 시도했지만 실제로 얻지는 않습니다. 처음에는 두 개의 다른 스레드에서 콘솔에 동시에 쓰는 것뿐입니다. 여기에 코드입니다 : 간단하지만 비동기로했다 스레드와비동기를 올바르게 사용하는 방법

static void Main(string[] args) 
{ 
    DoSomethingAsync(); 

    for (int i = 0; i < 1000; i++) 
     Console.Write("."); 

    Console.ReadLine(); 
} 

static async void DoSomethingAsync() 
{ 
    Console.WriteLine("DoSomethingAsync enter"); 

    //This does not seem good 
    await Task.Delay(1); 

    for (int i = 0; i < 1000; i++) 
     Console.Write("X"); 

    Console.WriteLine("DoSomethingAsync exit"); 
} 

/I이 이상한

에 내가 이것을 사용 톱
await Task.Delay(1); 

가장 기본적인 예를 넣을 때 나는 단지 그것을 끝낼 기다리고 있습니다. 그러나 비동기가 아닌 무언가 타임 아웃을 원할 때 무엇을해야할까요? 아무 것도 기다리지 않고 모든 코드가 주 스레드에서 실행됩니다. 이 코드와 동일한 동작을하지만 Task.Delay()를 사용하지 않으면 어떻게됩니까?

+5

'비동기 무효'를 사용하지 마십시오. – SLaks

+0

[async-await curation] (https://curah.microsoft.com/45553/asyncawait-general)을보십시오. –

답변

8

병렬 및 동시성은 동일하지 않습니다. 당신이 원하는 경우 for 루프는 다른 ThreadPool 스레드에 그 작업을 오프로드 병렬 사용 Task.Run에서 실행되는 :

static void Main(string[] args) 
{ 
    var task = Task.Run(() => DoSomething()); 

    for (int i = 0; i < 1000; i++) 
     Console.Write("."); 

    task.Wait() 
} 

static void DoSomething() 
{ 
    for (int i = 0; i < 1000; i++) 
     Console.Write("X"); 
} 

async-await는 비동기 작업에 사용되는 수도 실행 동시에 아니지만 반드시.

+1

이것은 정확히 원하는 행동을 보여줍니다. 감사합니다. – egon12

+1

비동기/대기 질문에 대해 자세히 설명하려면 키워드가하는 일과하지 않는 것에 대해 이해하는 것이 중요합니다. 특히, 실제로 아무 것도 비동기 적으로 실행되지는 않습니다. 그들이 수행하는 작업은 비동기 메소드가 비동기 적으로 완료되는 일종의 작업을 호출 할 것으로 예상된다는 것을 컴파일러에 알려주고, 메소드는 해당 작업의 완료를 기다린 다음 다른 작업을 계속 진행하려고합니다. 비동기 메서드에서 "대기"할 것이 없으면 정상적인 메서드처럼 그냥 완료됩니다. –

0

async Task 메서드를 사용하고 결과 작업에 Wait을 호출 할 수 있습니다. 이것은 효과가있다. 그러나 타이머 틱이 스레드 풀에서 제공되므로 병행 성이 도입됩니다. 스레드 안전성으로 인해 콘솔이 어떤 보장을하는지 확신 할 수 없습니다.

Consider setting up a single threaded synchronization context. 그런 것들은 UI 스레드와 매우 유사하게 동작합니다. 모든 코드는 단일 스레드로 실행되지만 아직 여러 개의 비동기 메소드를 실행할 수 있습니다.

관련 문제