2014-11-24 32 views
6

Kod anlaşmaları, sonuçları eşzamansız olarak beklemek yerine Görevleri diğer değişkenlerle olduğu gibi ele alır. Bu nedenle, aşağıdaki senaryo işe yaramaz ve yöntemin geri döndüğü, tamamlanmamış bir görev olduğu ve sonuçların zaman içinde o zamana ayarlanmayacağı zamandan beri bir Sözleşme istisnasına neden olmaz. Aşağıdaki senaryo için makul bir çözüm var mı?Kod Sözleşmeleri ve Görevleri

public Task LoadAppModel() 
{ 
    Contract.Ensures(app.User != null); 
    Contract.Ensures(app.Security != null); 
    Contract.Ensures(app.LocalSettings != null); 

    return Task.WhenAll(
     store.GetUserAsync().ContinueWith(t => { app.User = t.Result; }), 
     store.GetSecurityAsync().ContinueWith(t => { app.Security = t.Result; }), 
     store.GetLocalSettingsAsync().ContinueWith(t => { app.LocalSettings = t.Result; })); 
} 

Herhangi bir öneri takdir edilecektir. :) Sözleşme kalıplarını kırmamayı tercih ederim.

+0

Ne 'Task.WaitAll()' yerine 'WhenAll()' kullanımı hakkında ? – Claies

+1

Bu, asenkronizasyonu bozar. Asynchony'i bozmadan tek yol, onu çeşitli yöntemlere bölüyor gibi görünüyor. –

+0

ama tarif etme şekliniz, Async değil midir? C# 'Task' Sınıfı, async/await özelliklerinden önce varoldu ve her zaman bunları kullanan yöntemlerin Async ... – Claies

cevap

5

Kod anlaşmaları ve async birlikte iyi gitmeyin, bu yüzden gerçekten Contract.Ensures kullanamazsınız.

Ancak bir geçici çözüm var. Sen bir Task -returning yönteminden yönteminizi değiştirebilir bir async bir (temizleyici zaten olurdu) ve bunun yerine Contract.Assume kullanın:

public async Task LoadAppModel() 
{ 
    var userTask = store.GetUserAsync(); 
    var securityTask = store.GetSecurityAsync(); 
    var settingsTask = store.GetLocalSettingsAsync(); 
    await Task.WhenAll(userTask, securityTask,settingsTask); 

    app.User = userTask.Result; 
    app.Security = securityTask.Result; 
    app.LocalSettings = settingsTask.Result; 

    Contract.Assume(app.User != null); 
    Contract.Assume(app.Security != null); 
    Contract.Assume(app.LocalSettings != null); 
} 
+1

Bu düzgün bir numaradır. Ancak, varsayım, kod sözleşmelerinin türetilmiş özelliklerinin çoğunun (örneğin belgelerin) yararsız hale getirilmesi bağlamını değiştirir. Ancak kod sözleşmelerinin uyumsuzluğu desteklemesine kadar en iyi çözüm budur. Eşzamansız uygulanana kadar bunu cevap olarak işaretler. Teşekkürler :) –

İlgili konular