मैं एक डीबी के साथ असीमित रूप से काम करने के लिए नई async/प्रतीक्षा सुविधा का उपयोग करने की कोशिश कर रहा हूं। चूंकि कुछ अनुरोध लंबे समय तक हो सकते हैं, मैं उन्हें रद्द करने में सक्षम होना चाहता हूं। जिस मुद्दे में मैं चल रहा हूं वह यह है कि TransactionScope
स्पष्ट रूप से एक थ्रेड एफ़िनिटी है, और ऐसा लगता है कि कार्य को रद्द करते समय, Dispose()
गलत थ्रेड पर चलाया जाता है।रद्द करने योग्य async/प्रतीक्षा में TransactionScope का निपटान कैसे करें?
public void TestTx() {
var cancellation = new CancellationTokenSource();
var task = TestTxAsync (cancellation.Token);
cancellation.Cancel();
task.Wait();
}
private async Task TestTxAsync (CancellationToken cancellationToken) {
using (var scope = new TransactionScope()) {
using (var connection = new SqlConnection (m_ConnectionString)) {
await connection.OpenAsync (cancellationToken);
//using (var command = new SqlCommand (... , connection)) {
// await command.ExecuteReaderAsync();
// ...
//}
}
}
}
UPDATED: बाहर टिप्पणी की भाग वहाँ कुछ दिखाने के लिए है
"A TransactionScope must be disposed on the same thread that it was created."
कोड यह रहा:
विशेष रूप से, जब .TestTx()
बुला मैं निम्नलिखित AggregateException
युक्त InvalidOperationException
task.Wait()
पर मिलता है निष्पादित - असीमित रूप से - एक बार यह खुला होने के बाद कनेक्शन के साथ, लेकिन उस कोड को पुन: पेश करने के लिए उस कोड की आवश्यकता नहीं है।
क्या आप अपने दूसरे बिंदु पर विस्तार कर सकते हैं? सृजन को कहाँ ले जाएं? – chase
क्या आप फिर कनेक्शन को असीमित रूप से खोलने का सुझाव दे रहे हैं, और वास्तविक वर्कलोड के लिए ब्लॉकिंग कॉल का उपयोग करते हैं? या मैं फिर से कुछ याद कर रहा हूँ? – chase
इस समय आपके प्रश्न में आप केवल कनेक्शन को असीमित रूप से प्राप्त करते हैं। मैंने आपके उदाहरण का पालन किया है, लेकिन यदि आप कुछ वास्तविक वर्कलोड के साथ अपना प्रश्न अपडेट करते हैं, तो मैं अपना जवाब भी अपडेट कर सकता हूं। – Maarten