2017-09-12 13 views
0

나는이 대기 작업과 함께 대기 명령을 사용했습니다.C# Generic을 Async로 변경 한 후이 오류를 해결하는 방법? 작업 <T>

public static async Task<T> GetCompletedTask<T>(this T command) where T : CommandBase 
    { 
     var tcs = command.GetTaskCompletionSource(); 
     await tcs.Task.ConfigureAwait(false); 
     return command; 
    } 

다음은 사용할 예제입니다.

var result = await Class.GoRun(1).GetCompletedTask(); 

일반 "GoRun"으로 작성되었습니다. 내가 GoRun에서 기다리고 사용할 때문에

public T GoRun<T>(int RunnderID) 
     where T : CommandBase 

....

는하지만 ... 를 비동기하기 위해 "GoRun"를 변경해야합니다. 나는 이렇게 변한다.

public async Task<T> GoRun<T>(int RunnderID) 
     where T : CommandBase 

....이 수정 후

. "GetCompletedTask"오류가 발생합니다.

어떻게 수정해야합니까 (GetCompletedTask)? 여기

오류 메시지입니다. 내 생각에

'System.Threading.Tasks.Task<Bg7Uwp1.Commands.Device.SerialConnectCommand>' can not use T in a generic type or method 'CommandExtensions.GetCompletedTask<T>(T)' There is NO "Implicit reference conversion" 
From 'System.Threading.Tasks.Task<Bg7Uwp1.Commands.Device.SerialConnectCommand>' to 'Bg7Uwp1.Commands.CommandBase' 
Bg7Uwp1 

을 (나는 영어 일본어 번역), I는 "getCompletedTask"을 수정해야합니다. 나는 조금 ..하지만 생각 ...

enter image description here

+5

_ "Genereic을 비동기로 변경 한 후 _"_? o_O – SeM

+0

어떤 오류가 발생합니까? – Karolis

+0

어떤 제목이 더 좋습니까? 나는 최선의 노력을 다했다. ... (^ _ ^; –

답변

0

당신이, 당신이 awaitGoRun() 방법 모두에 전화 사이트를 변경해야 공유 코드의 작은 비트를 기반으로하고 GetCompletedTask() 방법을 썼다 :

var result = await (await Class.GoRun(1)).GetCompletedTask(); 

이다, 먼저는 GoRun(1)의 결과를 기다리고해야하고, 당신은 당신이 또한 기다리고있는의 GetCompletedTask()에 그 결과를 전달해야합니다.

이제 원하는대로 할 수 있습니까? 나는 모른다. 질문에 충분한 코드가 없으므로 시나리오를 완전히 보여주는 좋은 Minimal, Complete, and Verifiable code example을 신경 쓰지 마십시오. 위의 방법으로 문제가 만족스럽게 해결되지 않으면 질문을 개선하십시오.