0

이 질문에는 이미 답변이 있습니다.

나는 내가 asych 방법으로 선언하고있는 방법을 가지고있다. 코드는 다음과 같습니다.

private async Task<string> tempPassword()
{
    char[] hashes = "ABCDEFGHJKMNPQRUVWXY34689!?@$#".ToCharArray();
    Random r = new Random(DateTime.Now.Millisecond);
    List<char> bits = new List<char>();
    while (bits.Count < 7)
    {
         int i = r.Next(0, hashes.Length);
         if (!bits.Contains(hashes[i]))
              bits.Add(hashes[i]);
    }
    return string.Join("", bits.ToArray());
}

이 코드는 정확하고 컴파일되지만 Visual Studio는 다음과 같은 피드백을 제공합니다.

이 비동기 방법은 연산자를 기다리지 않고 동기식으로 실행됩니다.   대기중인 연산자를 사용하여 비 차단 API 호출을 기다리는 것이 좋습니다.   'Task.Run (...)'은 백그라운드 스레드에서 CPU-Bound 작업을 수행합니다.

내가 비동기에 대한 풍부한 배경을 가지고 있지는 않지만 (솔직히 말해서, 내가 그것을 사용하고있는 이유는 내가 배울 것이다) 나는이 방법에서 기다리고있는 연산자를 필요로하는 어떤 것이있는 것처럼 보이지 않는다. 나는 그것이 내가 기다리고 있기로되어있는 것이 무엇인지 조금 비웃었다.


  • 코드에 비동기가 전혀 없으므로 비동기로 표시되어서는 안됩니다. 컴파일러가 알려주려고하는 것입니다. 서명을 다음으로 변경하십시오.private string tempPassword() - shay__

1 답변


1

이 메서드에는 대기중인 연산자가 필요한 것이있는 것처럼 보이지 않습니다.

이 경우 왜 방법이async처음부터? 너는 단지 필요하다.async네가 사용하면await. 현재 상태에서 메서드는 동기식으로 실행되고 이미 완료된 메서드를 반환합니다.Task<string>. 비동기적일 필요가 없다고 기대한다면, 반환 할 시그니처를 변경할 수 있습니다.string. 앞으로 비동기식이 될 것으로 예상되는 경우 (또는 인터페이스를 구현 중이거나 기본 클래스의 메소드를 재정의하여 반환 유형을 변경할 수없는 경우)async한정자를 사용하고 완료된 작업을 명시 적으로 반환합니다.

return Task.FromResult(string.Join("", bits.ToArray()));

이렇게하면 비동기 상태 시스템을 작성하는 오버 헤드를 피할 수 있습니다.

연결된 질문


관련된 질문

최근 질문