2012-09-02 22 views
7

Puan, biz de TAP (Görev tabanlı programlama Desen) ile anlaşma. Bazı noktalarda, biz ContinueWith bir zaman uyumsuz yöntemine devamını sağlamak istiyoruz ve biz ContinueWith üzerine geçmesi temsilci içindeki bazı şeyler. Brad Wilson gibi SynchronizationContext ve ASP.NET Web API Genişletilebilirlik

biz devamlılık sağlamak zaman SynchronizationContext hayati önem taşıdığını derinlemesine here açıkladı. Benim için geri ASP.NET Web API SynchronizationContext almak gerekir tek yer ve (Bir ASP.NET Web API uygulamasında yapmaz şey) HttpContext.Current oynamak için gereken yerdir Thread.CurrentPrincipal gibi iş parçacığı için bazı bilgileri ayarlamanız gereken yer.

Yani soru şu: biz hiç biz vb İleti Yükleyici, Filtreler, biçemleyicilerle gibi bazı genişletilebilirlik noktalarında devamlılık sağlamak zaman SynchronizationContext geri almak istiyor musunuz?

cevap

2

cevap hemen hemen her zaman evet olduğunu. Hep kullanım senkronizasyon bağlam gidiyor, ancak ileti işleyicileri, filtreler ve biçemleyicilerle niteliği verilen bilmenizi isteriz değil

, onlar kullanılmasını gerektiren edeceğiz olsun veya olmasın tahmin edemez HttpContextBase'a erişmek için SynchronizationContext. Hatta size HttpContext erişim sağlar şey geçti mi filtrelerle birlikte

HttpContext sonuçta o örneğinden bilgi vermek parçacığı üzerinde akım CallContext bakmak için gidiyor, (bir IActionFilter implementation aracılığıyla söylemek). Geçerli iş parçacığı (eşzamansız çalıştırırken), Task'u başlattığınızda bu bilgilere sahip olmadığı için, bu çağrılar başarısız olur. Eğer o zaman kesinlikle erişmek amacıyla SynchronizationContext etrafında geçmesi gerekecek, istekle ilişkili HttpContextBase genel, sınırsız erişim gerekiyorsa

, Söylediğin.

Ancak, ihtiyacınız HttpContextBase ait dışarı detay kopyalamak ve geçmelidir mümkünse etrafında olduğunu; Çok genel bir şey yazıyorsanız, bu mümkün olmayacaktır. cevap için

+0

teşekkürler! Soruyu ASP.NET MVC ile karıştırdığınızı düşünüyorum. ASP.NET Ana Bilgisayarı altında olmadığınızı varsayalım. Ardından, HttpContext'e sahip olmayacaksınız. Dolayısıyla, uzayabilirlik noktaları bunlarla sıkıca birleşmez. – tugberk

+0

@tugberk Cevap hala aynı, aslında; Belirli bir içeriğe bağlı bir şeyiniz varsa ve sonra uyumsuz duruma geçmek istiyorsanız, gerçekten değerleri bağlamdan kopyaladığınızdan emin olun (veya * içeriğe * erişebildiğinizden emin olun) İşlem için gerekenler. – casperOne

+0

sorunu şu: Web API'sinde, neredeyse hiç bağlam yok. Kaynak koduna bakacak olursanız, thread + yoluyla aktarılan değişkenler içindeki bağlam, çerçeve altyapısını her zaman yeniden senkronize etmek için geri dönebilirsiniz. Bu nedenle, cevaplama geçerli değildir. – tugberk