Standart BeginRead ve EndRead yöntemlerini TcpClient'ten kullanırken ve Task.Factory.FromAsync kullanarak çok benzer bir kodum var.Task.Factory.FromAsync ve BeginX/EndX arasındaki fark nedir?
İşte bazı örnekler .. Hata kodu gösteriliyor hatası gösterilmiyor.
Task.Factory.FromAsync: BeginRead ve EndRead ile geri aramaları
private void Read(State state)
{
Task<int> read = Task<int>.Factory.FromAsync(state.Stream.BeginRead, state.Stream.EndRead, state.Bytes, state.BytesRead, state.Bytes.Length - state.BytesRead, state, TaskCreationOptions.AttachedToParent);
read.ContinueWith(FinishRead);
}
private void FinishRead(Task<int> read)
{
State state = (State)read.AsyncState;
state.BytesRead += read.Result;
}
Standart kullanım:
private void Read(State state)
{
client.BeginRead(state.Bytes, state.BytesRead, state.Bytes.Length - state.Bytes.Read, FinishRead, state);
}
private void FinishRead(IAsyncResult async)
{
State state = (State)async.AsyncState;
state.BytesRead += state.Stream.EndRead(async);
}
Bunların her ikisi de iyi çalışıyor ama onların farklılıklarının merak ediyorum. Her ikisi için kod satırları hemen hemen eşdeğerdir ve her ikisi de aynı işlevi yerine getirir ve aynı verime sahiptir. Hangisi tercih edilir? Üretim kodunda ne görmek istersiniz?
Cevabınız için teşekkürler! Yine de biraz kafam karıştı. BeginRead'in çok verimli olduğunu biliyorum çünkü geri arama engelleme yerine bir IO tamamlama portu kullanıyor. ContineWith aynı verimlilik açısından aynı mıdır ve aynı zamanda sadece aynı anda çalışır EndRead koştu? Ayrıca, daha iyi hata işlemeyi nasıl desteklediğini detaylandırır mısınız? Aynı zamanda her bir kod örneğindeki "state.BytesRead + =" satırlarında da aynı denemeyi yapmak zorunda kalmaz mıyım? –
@RyanPeschel: Evet, engellemez - aksi takdirde anlamsız olur. Ve hayır, aynı deneme/yakalamaya ihtiyacınız olmazdı, çünkü hata üzerinde çalıştırmak için bir devamlılık, iptalde bir diğeri de başarıya ulaşmak için başka bir tane belirtebilirsiniz - ContinueWith için aşırı yüklenmelere bakın. Ayrıca, yalnızca sonuca ulaşmaya çalışmaksızın bir görevin durumunu * test edebilirsiniz (Task.Status'a bakın). Her şey temelde çok daha zengin. Ve C# 5'deki async desteği harika. –
Aşırı yükleri kontrol ediyorum ama ne elde ettiğinizi göremiyorum. Hata/iptal olduğunda çalıştırılacak bir yöntemi nasıl belirleyebilirim? –