6

메트로 응용 프로그램을 개발 중이며 클래스를 구현할 비동기 작업을 일부 만들고 싶습니다.어떻게 IASyncOperation 인터페이스를 사용하여 WinRT에서 내 자신의 비동기 작업을 수행 할 수 있습니까?

WinRT 작업 (예 : CreateFileAsync)을 사용하여 비동기의 예를 발견했습니다. 나는 누군가가 비동기 메서드를 만들고 그것을 소비하는 것을 전혀 알지 못한다.

+0

왜 돈 ' 그냥 (부족한) 문서에 따라 메소드를 구현하려고합니까? – svick

+0

분명히, 당신은 관련이 무엇인지에 대한 심층적 인 지식이 없습니다. 이것이 문서가 제안하는 것입니다. 감사합니다. –

+2

이해가 안됩니다. 그 문서는 SO에 묻고 있다고 제안합니까? – svick

답변

2

나는 마이크로 소프트 포럼에 같은 질문을 게시하고 나에게 두 가지 대답을 주었다. 첫 번째는했다 : 개발자에서

안녕 클라우디오,

자신의 비동기 작업을 쉽게 만들 수있는 방법이 아닙니다 미리보기. 우리는이 단점을 알고 있으며 으로 다음 음모 출시를 위해 노력하고 있습니다. 그 사이에 API를 비동기로 디자인하고 을 비동기로 변환하는 방법에 대한 지침을 제공 할 수 있습니다. 우리는있어

:

감사

라만 샤르마, 비주얼 C++

나는이 작업을 수행하는 어려운 방법, 다른 사람을 요청, PPL에 대한 책임을 누군가가 나에게 말했다 샘플 팩을 새로 고치기 위해 우리는 몇 주 전에 약간의 을 발표하고 비동기 작업 생성시 몇 가지 샘플을 추가했습니다. 나는 이 2 ~ 3 주 정도 걸릴 것이라고 예상합니다. 우리 블로그에 눈을 계속 두는 경우 http://blogs.msdn.com/b/nativeconcurrency에 이 가장 먼저 나옵니다.

그것이 얼마나 힘든지에 관해서는 ... 우리가 고민 을하고있는 범용 솔루션은 템플릿 메타 프로그래밍의 풍부한 사용을 만드는 코드를 C++의 약 1000 라인입니다. 대부분은 헤더 파일에 있으므로 을 직접 탐색 할 수 있습니다. 덜 일반적인 솔루션은 덜 덜 수 있지만, 당신은 여전히 ​​ 관리, 오류 처리 등 상태를 할 기본 클래스를 구현해야합니다.이 순간에 나는 더 이상 세부 사항에 갈 수 없지만, 내가 말할 것입니다 비동기 작업을 PPL로 작성하는 것이 얼마나 쉬운 지 알고 싶습니다.

아르투르 Laksberg PPL 팀은

그런 다음 그 시간에 해결책이 없습니다. 다들 감사 해요.

2

예, Ben Kuhn의 // BUILD/talk : http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T을 참조하십시오. 그는 비동기 API를 작성하는 방법을 보여줍니다.

현재 높은 수준 (C++/WX) 클래스에는 좋은 해결책이 없습니다. 그러나 낮은 수준의 C++ 인터페이스를 사용하는 경우 WRL :: AsyncBase 클래스를 사용하여 비동기 인터페이스를 구축 할 수 있습니다.

Here은 AsyncBase 클래스에 대한 문서입니다.

+0

AFAICS, 그는 .Net 클래스'AsyncInfoFactory'를 사용하여 비동기 인터페이스를 빌드하는 방법을 보여줍니다. 이것은 C++/CX에서 사용할 수 없습니다. – svick

+1

PPL은 장기적인 솔루션으로, 분명히 지금은 옵션이 아닙니다. 그러나 비동기 API는 비교적 간단합니다. wrl \ async.h를 살펴보면 WRL :: AsyncBase 클래스를 사용하여 비동기 C++ 클래스를 만들 수 있습니다. 상위 수준 클래스가 아닌 하위 수준 C++ 클래스에서만 작동하므로 개발자 미리보기 빌드에서이 문제를 해결할 수있는 몇 가지 문제가있을 수 있습니다. –

+0

감사합니다. 약간의 해법과 패턴으로 MS를 기대하기는하지만 더 합리적인 것처럼 보입니다. 그럼에도 불구하고, 나는이 자료를 되풀이하고 있습니다. 그러나 당신이 볼 수 있듯이, 그들은 어떤 경로를 따라 가도록 나를 격려하지 않았습니다. –

4

사용 create_async를 사용하여 :

IAsyncOperationWithProgress<IBuffer^, unsigned int>^ RandomAccessStream::ReadAsync(IBuffer^ buffer, unsigned int count, InputStreamOptions options) 
{ 
    if (buffer == nullptr) 
     throw ref new InvalidArgumentException; 

    auto taskProvider = [=](progress_reporter<unsigned int> progress, cancellation_token token) 
    { 
     return ReadBytesAsync(buffer, count, token, progress, options); 
    }; 
    return create_async(taskProvider); 
} 

사용 AsyncInfo.Run .NET에서 :

+0

이제 C++/CX에서 await 키워드입니까? TPL 도요? :) 그러나 이것은 여전히 ​​.NET의 좋은 팁입니다. –

+0

죄송합니다. 언어는 질문에 명시되어 있지 않습니다. –

+0

C++ 샘플 코드도 추가했습니다. –

0

혼란 스럽지만 WinRT C++ 코드와 WRL간에 차이가 있습니다. WRL을 사용하여 ABI 계층에 직접 코딩 할 수 있습니다. WRL은 예외를 사용하지 않지만 템플릿을 선호합니다. WinRT의 권장 코딩 스타일은 WRL과 다릅니다.

내가 모두이 작업을 수행 할 수 있는지 잘 모르겠지만, 상속 클래스를 구현하기 위해 일반적으로 필요로 WRL을 사용 :

다음
class CreateAysncOp: public RuntimeClass<IAsyncOperation<result_runtime_class*>,AsyncBase<IAsyncCompletedHandler<result_runtime_class*>> 
{ 
... 

사용할 수

hr = MakeAndInitialize<CreateAsyncOp, IAsyncOperation<type_foo*>>(...); 

관련 문제