2014-04-11 5 views
5

मेरे पास एक पुराना एप्लिकेशन है जिसे मैंने लिखा था जहां मैंने डीबी से डेटा प्राप्त करने के लिए Microsoft.Practices.EnterpriseLibrary.Data का उपयोग किया था। मैंने हाल ही में .NET 4.5 में अपग्रेड किया है और का इंतजार करना चाहता/awync का लाभ उठाना चाहता था।प्रतीक्षा/async माइक्रोसॉफ्ट प्रैक्टिस एंटरप्राइज़ लाइब्रेरी डेटा

मुझे पैकेजिंग के नवीनतम संस्करण में नामकरण मानक के अनुसार "Async" में समाप्त होने वाली कोई भी विधि दिखाई नहीं दे रही है। क्या यह एडीओ .NET लाइब्रेरी के साथ मैन्युअल रूप से इसे अतुल्यकालिक बनाये बिना प्रतीक्षा/async का उपयोग करना संभव है?

उत्तर

6

मैं वास्तव में Async तरीकों को खोजने में सक्षम था संयोजन के रूप में Task.Factory.FromAsync का उपयोग कर एक फ़ाइल को पढ़ने के लिए का एक उदाहरण है। मैं सिर्फ गलत धब्बे देख रहा था।

 var db = DatabaseFactory.CreateDatabase(GlobalConstants.DBConnection); 
     using (var cmd = db.GetStoredProcCommand("SprocName", parameterA)) 
     { 
      await cmd.ExecuteNonQueryAsync(); 
     } 

और जब आप डेटा प्राप्त करना चाहते: यदि आप डेटा की बड़ी मात्रा के साथ CommandBehavior.SequentialAccess उपयोग कर रहे हैं

 var db = DatabaseFactory.CreateDatabase(GlobalConstants.DBConnection); 
     using (var cmd = db.GetStoredProcCommand("SprocName", parameterA, parameterB, parameterC)) 
     { 
      using (var dr = await cmd.ExecuteReaderAsync()) 
      { 
       while (await dr.ReadAsync()) 
       { 
        return dr.GetInt32(0); 
       } 
      } 
     } 

आप GetFieldValueAsync<T> बजाय GetInt32 उपयोग कर सकते हैं यहाँ एसिंक्रोनस रूप से डीबी तक पहुँचने का दो सामान्य तरीके हैं। लेकिन, ज्यादातर मामलों के लिए, आपको शायद ऐसा करने की आवश्यकता नहीं है।

+0

कनेक्शन खोलने के बारे में क्या? –

+2

मुझे वास्तव में इन तरीकों को अभी नहीं दिख रहा है..मुझे नूजेट के माध्यम से नवीनतम एंटरप्राइज़ लाइब्रेरी डेटा मिला है और अभी भी इन तरीकों को ढूंढने में सक्षम नहीं है..क्या आप मुझे ent lib का संस्करण बता सकते हैं? – Bala

+1

ExecuteReaderAsync एंटरप्राइज़ लाइब्रेरी से नहीं है - https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executereaderasync(v=vs.110).aspx – StingyJack

0

आप शायद मिल जाएगा यह BeginXXX और EndXXXX तरह के तरीकों है तो आप उसे Task.Factory.FromAsync साथ संयोजन के रूप में उन का उपयोग कर सकते हैं। अधिक जानकारी here

यहाँ यह उपयोग करने के साथ filestream.BeginRead और filestream.EndRead

private async Task<string> ReadFileAsync() 
{ 
    var fileStream = File.OpenRead("..\\..\\..\\test.txt"); 
    var buffer = new byte[1024]; 

    await Task<int>.Factory.FromAsync(fileStream.BeginRead, fileStream.EndRead, buffer, 0, buffer.Length, null); 

    return System.Text.Encoding.ASCII.GetString(buffer); 
} 
6

मैं ईएल का पुराना संस्करण उपयोग कर रहा हूं जो आरंभ */अंत * विधियों की पेशकश करता है, लेकिन async संस्करण नहीं। कुछ सरल विस्तार विधियां जीवन को सरल बनाती हैं:

public static async Task<IDataReader> ExecuteReaderAsync(this SqlDatabase database, DbCommand command) 
{ 
    return await Task<IDataReader>.Factory.FromAsync(database.BeginExecuteReader, database.EndExecuteReader, command, null); 
} 

public static async Task<object> ExecuteScalarAsync(this SqlDatabase database, DbCommand command) 
{ 
    return await Task<object>.Factory.FromAsync(database.BeginExecuteScalar, database.EndExecuteScalar, command, null); 
} 

public static async Task<XmlReader> ExecuteXmlReaderAsync(this SqlDatabase database, DbCommand command) 
{ 
    return await Task<XmlReader>.Factory.FromAsync(database.BeginExecuteXmlReader, database.EndExecuteXmlReader, command, null); 
} 

public static async Task<int> ExecuteNonQueryAsync(this SqlDatabase database, DbCommand command) 
{ 
    return await Task<int>.Factory.FromAsync(database.BeginExecuteNonQuery, database.EndExecuteNonQuery, command, null); 
} 
संबंधित मुद्दे