2014-09-04 63 views
1

如果之前曾詢問過此問題的變體,我表示歉意,但我正在努力尋找適用於我目前情況的答案。如何等待任務在WCF服務操作中完成

我正在一個項目中,我被要求通過WCF服務公開基於任務的提供者的操作。提供者接口明確定義Task<T>每個方法的返回類型,這裏有一個例子:

public interface IContactProvider 
{ 
    Task<IEnumerable<Contact>> GetAllContacts(); 
} 

在試圖揭露這是一個WCF服務,我已經基本確定供應商界面的「同步」版本作爲導致看起來像這樣的服務實現的服務合同的使用:

public class ContactService : IContactService 
{ 
    private IContactProvider contactProvider; 

    public IEnumerable<Contact> GetAllContacts() 
    { 
     return contactProvider.GetAllContacts().Result; 
    } 
} 

我的直覺告訴我,我在這裏做得不對,我應該是「等待」爲Result可用一些另一種方式。有一個更好的方法嗎?

回答

2

你在做什麼應該可以正常工作(Result會阻塞,直到任務完成),但是你使用.NET 4.5嗎?如果是這樣,您可以簡單地聲明您的服務運營合同,直接返回async Task<T>。這樣你的客戶端就可以自動獲得同步或異步調用的選項(通過生成的服務客戶端)。

這裏有一個帖子,我發現比MSDN文檔更加有用:http://blog.vuscode.com/malovicn/archive/2012/01/21/what-is-new-in-wcf-in-net-4-5-taskt-and-async.aspx

+0

我猜的事實,'Result'塊是什麼,我很擔心。我不想創建一個場景,其中的服務會出現死鎖,但也許這在這裏是不可能的?此外,我使用.NET 4.5,但我不能保證其他客戶端將是.NET(或.NET 4.5)。在服務合同中使用任務會導致這些客戶端出現問題? – sellmeadog 2014-09-04 03:17:52

+2

@sellmeadog您不應該爲客戶端和服務器端合同重複使用相同的接口。服務器端接口可以是'Task > GetAllContactsAsync();'和客戶端接口可以是'IEnumerable GetAllContacts()',它將會與WCF一起工作。 WCF會自動向客戶端公開每種方法的同步和異步版本,但服務器只需要實現其中的一種。 – 2014-09-04 03:54:48