2016-03-21 22 views
0

Müşteri verilerini almak için zaman alabilen işlevlere sahip bir dll var. Şimdiye kadar UI kilitleme önlemek için iyi eski threading.thread.start yöntemleri kullanarak oldum, ama ben .net 4.5 içinde Await/Async yöntemleri etrafında başımı almaya çalışıyorum. Bu işlevler etrafında bir Await sarıcısı oluşturmak için basit bir yol var mı? Dll'yi 4,5'e güncelleyebilirim ancak kodun yapısını değiştiremez. Her şey bir hatayla sonuçları deneyin .. Boole.net Varolan/eski kodla bekle

Örnek kodudur 'uygun bir GetAwaiter yöntemine sahip '' bekliyoruz bu tür gerektirir' .... anlamıyorum ne

Public Async Function GetByID(id As Integer) As Task(Of Boolean) 
     'serviceBase is a dll with a number of functions for getting 
     'data that returns true when a customer object has been filled 
     Return Await ServiceBase.GetCustomer(id) 
    End Function 

olduğunu ServiceCase'de GetCustomer'ı güncelleyebilseydim, bunu Async olarak işaretlemeli ve bir görevi (Boole) döndürmeliyim. Ancak, hatalar alıyorum çünkü GetCustomer'ın herhangi bir noktada Await kullanmasına gerek kalmıyor. Bu, engellenen bir kullanıcı arayüzüne toplam olarak eklediği bir dizi küçük işlem.

+0

aslında bir müşteri bir zaman uyumsuz işlem alma eylemidir mı? Eşzamansız bir yöntem olan Async'in anlamı yoktur. Kodu GetCustomer'da gösterebilir miydiniz, bu durumda daha ilginç. – kai

+0

Bu işlevin bir örneği (bir müşteri, örneğin kaynak A & C ile ilgili ayrıntılara sahip olabilir) 'Genel İşlev GetCustomer (Tamsayı olarak id) Boolean Olarak GetFromSourceA (id) Sonra ', bazı müşterilerle çalışabilir ve doğru olarak dön müşteri ile bazı işler yapmak ve gerçek End dönmek GetFromSourceB (id) Sonra ' GetFromSourceC (id) Sonra Eğer varsa müşteri ile bazı işler yapmak ve gerçek End dön' Eğer End If Eğer varsa IsNothing (müşteri) Sonra iade Yanlış İade Gerçek Bitiş İşlevi ' – user3334804

+0

Ne @ anlamı,' GetCustomer 'sürece bir görev döndürür, çağrılıyor 'GetCustomer' değil 'eşzamanlı olarak automagically yapmak için gidiyoruz. "async/await", * zaten * eşzamansız yöntemler için * beklemeyi * kolaylaştıran sözdizimsel şekerdir. Örneğin, "GetCustomer" bir web servisi çağırırsa, bir hizmet yöntemini zaman uyumsuz olarak çağırmak için 'client.CallThatMethodAsync' komutunu kullanabilir ve "client.CallThatMethod" işlevini eşzamanlı olarak çağırmak yerine sonucu alabilirsiniz. Eğer bir DB erişim metodu ise, 'ExecuteReaderAsync' yerine 'ExecuteReader' –

cevap

0

Eşzamansız sarmalayıcılar istediğiniz yöntemler gerçekten Eşzamansız değilse, örneğin, gerçekten G/Ç değiller, bunun yerine kullanıcı arayüzünü bir masaüstü uygulaması olarak engelleyen uzun süreli işlemler değil, yalnızca gerçek çağrıyı Await Task.Run (Function() ServiceBase.GetCustomer (id)) yöntemindeki dll yöntemi. Bir asp.net uygulamasıysa, senkronize işlemin senkronize olmasına izin verin.

Yapmak istemediğiniz şey, sahte bir sıralı sarmalayıcı oluşturmak ve Task.Run'u çağırarak dll'inize eklemektir. Bir şey CPU bağlıysa ve kullanıcı arayüzünü (masaüstü uygulaması) engelliyorsa, belirli uygulama içeriğinizde Task.Run ile arayın ve dll'nizde sahte bir uyumsuzluk uygulaması oluşturmayın. İşte Stephen Cleary tarafından bazı büyük kaynaklar konuda şunlardır:

Stephen Cleary's Blog on Task.Run

+0

Mükemmel teşekkürler, DLL'ye dokunmak istemediğim ana neden orada senkronize kalmaya çalışmak istedim ve bunu değiştirmek için doğru hissetmedim. Kaynak benim düşüncelerimi onaylar bu kötü bir uygulama olur, bu nedenle Async ile Task.Run'a değişerek çitin UI/Uygulama tarafında güzel çalışır. Sanırım günün sonunda gerçekten anlamadığım/okuduğum çok daha kolay bir koddan başka bir şey elde edemedim - bunun bir kısmını yeniden yazdığım için değerli bir iş gibi görünüyor. – user3334804

+0

Tamamen anlamak. Son zamanlarda benzer bir seslendirme senaryosunda bir masaüstü uygulaması ile çalıştım. – davidallyoung

İlgili konular