6

Bir metro uygulaması geliştiriyorum ve kendi sınıflarımın uygulayacağı bazı async işlemleri oluşturmak istiyorum.IAsyncOperation arabirimini kullanarak WinRT ile kendi asenkron işlemlerimi nasıl yapabilirim?

WinRT işlemlerini (örneğin, CreateFileAsync) kullanarak yalnızca async örneklerini buldum. Birisinin uyumsuz bir yöntem oluşturduğu ve tükettiği bir durum bulamıyorum.

+0

Neden don' yöntemleri (oldukça az olan) belgelere göre uygulamaya çalıştınız mı? – svick

+0

Açıkçası, neyin dahil olduğuna dair derin bir bilginiz yok. Bu, belgelerin önerdiği şeydir. Teşekkür ederim. –

+2

Anlamıyorum. Dokümantasyon SO soruyor? – svick

cevap

2

Aynı soruyu Microsoft forumlarında yayınladım ve bana iki yanıt verdi. İlk vardı: Geliştirici olarak

Merhaba Claudio

Kendi zaman uyumsuz işlemlerini oluşturmak için kolay bir yol yoktur Önizleme. Bu olumsuzluğun farkındayız ve bir sonraki pubik sürüm için 'u çözmeye çalışıyoruz. Bu arada, API'nizi eşzamansız olarak tasarlayabilir ve senkronizasyonu async'e nasıl dönüştürebileceğinizi gösteririz. Bizler

:

Teşekkür

Raman Sharma, Visual C++

Bunu yapmak zor yoldan, başka bir adama istedi PPL sorumlu birisi bana söyledi Örnek paketini yenilemeyi planladığımızda birkaç hafta önce yayınladık ve asenkron işlemlerin oluşturulmasına birkaç örnek ekledik. , bunun birkaç hafta içinde olacağını umuyoruz. gözümüzü http://blogs.msdn.com/b/nativeconcurrency adresindeki blogumuzda tutarsanız, ilk kez numaralı telefonu kullanacaksınız.

Ne kadar zor olduğu hakkında ... düşüncemizin genel amaçlı çözümü, yaklaşık 1000 satırlık C++ kodunun şablon metaprogramlaması ile bolca kullanılmasıdır. Birçoğu başlık dosyasında olacak böylece kendiniz keşfedebilirsiniz. Daha az genel bir çözüm daha az karmaşık olabilir iken, hala bir temel sınıf uygulamak gerekir, devlet yönetimi, hata işleme vb. Şu anda daha fazla detayına giremiyorum, ama ben size PPL ile yazarın async işlemleri için ne kadar kolay olduğunu seveceksiniz - yani orada asılı!

Artur Laksberg PPL ekibi

Sonra, o zaman hiçbir çözüm yoktur. Hepinize teşekkür ederim.

2

Evet, bkz. Ben Kuhn'in // BUILD/talk: http://channel9.msdn.com/events/BUILD/BUILD2011/PLAT-203T Eşzamansız bir API'nin nasıl oluşturulacağını gösterir.

Geçerli zamanda, yüksek düzey (C++/WX) sınıfları için iyi bir çözüm yoktur. Ancak, düşük düzey C++ arabirimlerini kullanırsanız, async arabirimlerinizi oluşturmak için WRL :: AsyncBase sınıfını kullanabilirsiniz.

Here, AsyncBase sınıfı hakkında belgelerdir.

+0

AFAICS, .Net sınıfı 'AsyncInfoFactory' kullanarak async arabiriminin nasıl oluşturulacağını gösterir, bu C++/CX'den edinilemez. – svick

+1

PPL uzun vadeli bir çözüm, şu anda bu bir seçenek değil. Ancak async API'leri nispeten basittir. Wrl \ async.h dosyasına bir göz atın, WRL :: AsyncBase sınıfı bir asenkron C++ sınıfı oluşturmanıza izin verir. Sadece düşük seviyeli C++ sınıflarıyla değil, yüksek seviyeli sınıflarla çalıştığını unutmayın, bu yüzden geliştirici önizlemesi üzerinde çalışmak için bazı zorluklar olabilir. –

+0

Hepinize teşekkür ederim. MS, bazı çözüm ve kalıpları ile beklemek daha makul görünüyor. Öyle bile olsa, bu materyale tekrarlıyorum, ama görebildiğiniz gibi, beni herhangi bir yola uymaya yönlendirmediler. –

4

kullanın create_async kullanarak:

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); 
} 

Kullanım AsyncInfo.Run NET'te:

public IAsyncOperation<IInfo> Async() 
{ 
    return AsyncInfo.Run(_ => 
     Task.Run<AType>(async() => 
     { 
      return await DoAsync(); 
     }) 
    ); 
} 
+0

THere şimdi C++/CX'de bir bekletme anahtar kelimesi mi? Ve TPL de mi? :) Ama bu hala .NET –

+0

için özür dilerim. Söz konusu dil belirtilmemiş. –

+0

Ayrıca bir C++ örnek kodu ekledim. –

0

Kafa karıştırıcı, ancak WinRT C++ kodu ve WRL arasında bir fark var. Doğrudan ABI katmanına kodlamak için WRL'yi kullanabilirsiniz. WRL istisnalar kullanmaz, ancak şablonları sever. WinRT için önerilen kodlama stili, WRL ile aynı değildir.

Ben herkes yapabilirsiniz emin değilim, ama devralan bir sınıf uygulamak için genel ihtiyaç WRL kullanmakta:

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

kullanabileceğiniz

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

İlgili konular