Asynchronous Görevler ve Varlık Çerçevesi (Mono ile Linux (RHEL) altında çalıştırmak amacıyla, ancak diğer bir zorluktur) kullanan basit bir C# konsol uygulaması yazıyorum. .NET 4.0'ı hedeflediğimi unutmayın, bu yüzden await
yerine .ContinueWith()
kullanıyorum.Genel Üzerinde Belirsiz Çağırma ContinueWith
using System;
using System.Linq;
using System.Threading.Tasks;
namespace MonoEF
{
class Program
{
private static Model.NorthwindEntities _db = new Model.NorthwindEntities();
static void Main(string[] args)
{
try
{
GetCustomerNamesAsync().ContinueWith(t => {
if (t.IsFaulted) Console.WriteLine(t.Exception.Flatten.ToString);
else if (t.IsCompleted) foreach (string result in t.Result) Console.WriteLine(result);
});
Console.ReadLine();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
private static Task<string[]> GetCustomerNamesAsync()
{
return Task.Factory.StartNew(() => (from c in _db.Customers select c.ContactName).Distinct().ToArray());
}
}
}
Sorun .ContinueWith()
aşağıdaki hatayı alıyorum geçerli::
Ambiguous Invocation:
System.Threading.Tasks.Task.ContinueWith(System.Action<System.Threading.Tasks.Task<string[]>>) (in class Task<string[]>)
System.Threading.Tasks.Task.ContinueWith(System.Action<System.Threading.Tasks.Task>) (in class Task)
match
Bu, artı bir Northwind veritabanı EF DB modeli uygulamanın UYULMASINA
Bana göre, çağrının belirsiz olmaması gerekir, derleyici genel olmayan Görev üzerinde genel Görev tercih etmelisiniz, özellikle GetCustomerNamesAsync()
çıktısı olduğu gibi. Ancak, bir VB.NET geliştiricisi olarak, bu durumda muhtemelen Option Infer
güveniyorum.
Derleyiciye C# 'da kullanmak istediğimi hangi çağrının bildiğini açıkça bildirmek için nasıl giderim?
Beni doğru çözüme yönlendirdiniz. Açıkça bildiren '.ContinueWith ((Görev t) => {...})' sonra bir sonraki soruyu, 'Console.WriteLine (t.Exception.Flatten.ToString) '' yerine Console.WriteLine çağırıyordu. (t.Exception.Flatten(). .ToString()) '. Bunu düzelttikten sonra, açık lambda parametre bildirimini kaldırabiliyordum ve derleyici mutluydu. –
MCattle
@MCattle Buradaki eksik parantezlerin, derleyicinin iki aşırı yüklenme arasında karar verememesi ilginçtir. Kendi cevabımdan biraz şüpheliydim, çünkü lambda girdi türüne sayısız defa “ContinueWith” kullanıyorum. Eksik parantezlerin neden farkı yaratacağını açıklayamıyorum. –
Bana göre bir anlam ifade ediyor, çünkü aşırı yüklenme kullanımdan kaynaklanıyor ve kullanımda bir sözdizimi hatası varsa, doğru aşırı yüke ulaşılamıyor. – MCattle