메트로 응용 프로그램을 개발 중이며 클래스를 구현할 비동기 작업을 일부 만들고 싶습니다.어떻게 IASyncOperation 인터페이스를 사용하여 WinRT에서 내 자신의 비동기 작업을 수행 할 수 있습니까?
WinRT 작업 (예 : CreateFileAsync)을 사용하여 비동기의 예를 발견했습니다. 나는 누군가가 비동기 메서드를 만들고 그것을 소비하는 것을 전혀 알지 못한다.
메트로 응용 프로그램을 개발 중이며 클래스를 구현할 비동기 작업을 일부 만들고 싶습니다.어떻게 IASyncOperation 인터페이스를 사용하여 WinRT에서 내 자신의 비동기 작업을 수행 할 수 있습니까?
WinRT 작업 (예 : CreateFileAsync)을 사용하여 비동기의 예를 발견했습니다. 나는 누군가가 비동기 메서드를 만들고 그것을 소비하는 것을 전혀 알지 못한다.
나는 마이크로 소프트 포럼에 같은 질문을 게시하고 나에게 두 가지 대답을 주었다. 첫 번째는했다 : 개발자에서
안녕 클라우디오,
자신의 비동기 작업을 쉽게 만들 수있는 방법이 아닙니다 미리보기. 우리는이 단점을 알고 있으며 으로 다음 음모 출시를 위해 노력하고 있습니다. 그 사이에 API를 비동기로 디자인하고 을 비동기로 변환하는 방법에 대한 지침을 제공 할 수 있습니다. 우리는있어
:
감사
라만 샤르마, 비주얼 C++
나는이 작업을 수행하는 어려운 방법, 다른 사람을 요청, PPL에 대한 책임을 누군가가 나에게 말했다 샘플 팩을 새로 고치기 위해 우리는 몇 주 전에 약간의 을 발표하고 비동기 작업 생성시 몇 가지 샘플을 추가했습니다. 나는 이 2 ~ 3 주 정도 걸릴 것이라고 예상합니다. 우리 블로그에 눈을 계속 두는 경우 http://blogs.msdn.com/b/nativeconcurrency에 이 가장 먼저 나옵니다.
그것이 얼마나 힘든지에 관해서는 ... 우리가 고민 을하고있는 범용 솔루션은 템플릿 메타 프로그래밍의 풍부한 사용을 만드는 코드를 C++의 약 1000 라인입니다. 대부분은 헤더 파일에 있으므로 을 직접 탐색 할 수 있습니다. 덜 일반적인 솔루션은 덜 덜 수 있지만, 당신은 여전히 관리, 오류 처리 등 상태를 할 기본 클래스를 구현해야합니다.이 순간에 나는 더 이상 세부 사항에 갈 수 없지만, 내가 말할 것입니다 비동기 작업을 PPL로 작성하는 것이 얼마나 쉬운 지 알고 싶습니다.
아르투르 Laksberg PPL 팀은
그런 다음 그 시간에 해결책이 없습니다. 다들 감사 해요.
예, Ben Kuhn의 // BUILD/talk : http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T을 참조하십시오. 그는 비동기 API를 작성하는 방법을 보여줍니다.
현재 높은 수준 (C++/WX) 클래스에는 좋은 해결책이 없습니다. 그러나 낮은 수준의 C++ 인터페이스를 사용하는 경우 WRL :: AsyncBase 클래스를 사용하여 비동기 인터페이스를 구축 할 수 있습니다.
Here은 AsyncBase 클래스에 대한 문서입니다.
AFAICS, 그는 .Net 클래스'AsyncInfoFactory'를 사용하여 비동기 인터페이스를 빌드하는 방법을 보여줍니다. 이것은 C++/CX에서 사용할 수 없습니다. – svick
PPL은 장기적인 솔루션으로, 분명히 지금은 옵션이 아닙니다. 그러나 비동기 API는 비교적 간단합니다. wrl \ async.h를 살펴보면 WRL :: AsyncBase 클래스를 사용하여 비동기 C++ 클래스를 만들 수 있습니다. 상위 수준 클래스가 아닌 하위 수준 C++ 클래스에서만 작동하므로 개발자 미리보기 빌드에서이 문제를 해결할 수있는 몇 가지 문제가있을 수 있습니다. –
감사합니다. 약간의 해법과 패턴으로 MS를 기대하기는하지만 더 합리적인 것처럼 보입니다. 그럼에도 불구하고, 나는이 자료를 되풀이하고 있습니다. 그러나 당신이 볼 수 있듯이, 그들은 어떤 경로를 따라 가도록 나를 격려하지 않았습니다. –
사용 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에서 :
이제 C++/CX에서 await 키워드입니까? TPL 도요? :) 그러나 이것은 여전히 .NET의 좋은 팁입니다. –
죄송합니다. 언어는 질문에 명시되어 있지 않습니다. –
C++ 샘플 코드도 추가했습니다. –
혼란 스럽지만 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*>>(...);
왜 돈 ' 그냥 (부족한) 문서에 따라 메소드를 구현하려고합니까? – svick
분명히, 당신은 관련이 무엇인지에 대한 심층적 인 지식이 없습니다. 이것이 문서가 제안하는 것입니다. 감사합니다. –
이해가 안됩니다. 그 문서는 SO에 묻고 있다고 제안합니까? – svick