При вызове службы WCF асинхронной, кажется, есть два способа сделать это.
1.
WcfClient _client = new WcfClient();
public void One()
{
_client.BegindoSearch("input", ResultOne, null);
}
private void ResultOne(IAsyncResult ar)
{
string data = _client.EnddoSearch(ar);
}
2.
public void Two()
{
WcfClient client = new WcfClient();
client.doSearchCompleted += TwoCompleted;
client.doSearchAsync("input");
}
void TwoCompleted(object sender, doSearchCompletedEventArgs e)
{
string data = e.Result;
}
А с новым классом Task<T>
у нас есть простой третий способ, включив синхронную операцию в задачу.
3.
public void Three()
{
WcfClient client = new WcfClient();
var task = Task<string>.Factory.StartNew(() => client.doSearch("input"));
string data = task.Result;
}
Они все дают вам возможность выполнять другой код, пока вы ждете результата, но я думаю, что Task<T>
дает лучший контроль над тем, что вы выполняете до или после получения результата.
Есть ли преимущества или недостатки использования одного над другим? Или сценарии, где один из способов сделать это более предпочтителен?