मुझे मेरा कोड के टुकड़े में डेडलॉक-इश्यू का सामना करना पड़ रहा है। शुक्र है, मैं नीचे दिए गए उदाहरण में समस्या को पुन: उत्पन्न करने में सक्षम हूं। एक सामान्य .NET कोर 2.0 कंसोल अनुप्रयोग के रूप में चलाएं।क्या डेडलॉक का कारण बन रहा है?
class Class2
{
static void Main(string[] args)
{
Task.Run(MainAsync);
Console.WriteLine("Press any key...");
Console.ReadKey();
}
static async Task MainAsync()
{
await StartAsync();
//await Task.Delay(1); //a little delay makes it working
Stop();
}
static async Task StartAsync()
{
var tcs = new TaskCompletionSource<object>();
StartCore(tcs);
await tcs.Task;
}
static void StartCore(TaskCompletionSource<object> tcs)
{
_cts = new CancellationTokenSource();
_thread = new Thread(Worker);
_thread.Start(tcs);
}
static Thread _thread;
static CancellationTokenSource _cts;
static void Worker(object state)
{
Console.WriteLine("entering worker");
Thread.Sleep(100); //some work
var tcs = (TaskCompletionSource<object>)state;
tcs.SetResult(null);
Console.WriteLine("entering loop");
while (_cts.IsCancellationRequested == false)
{
Thread.Sleep(100); //some work
}
Console.WriteLine("exiting worker");
}
static void Stop()
{
Console.WriteLine("entering stop");
_cts.Cancel();
_thread.Join();
Console.WriteLine("exiting stop");
}
}
मैं क्या उम्मीद थी पूरा अनुक्रम इस प्रकार है:
Press any key...
entering worker
entering loop
entering stop
exiting worker
exiting stop
हालांकि, वास्तविक अनुक्रम Thread.Join
फोन पर रुक जाता:
Press any key...
entering worker
entering stop
अंत में, अगर मैं एक डालने MainAsync
शरीर में छोटी देरी, सब ठीक हो जाता है। क्यों (कहाँ) डेडलॉक होता है?
नोट: मूल कोड में मैंने के बजाय SemaphoreSlim
का उपयोग करके हल किया, और इसमें कोई समस्या नहीं है। मैं केवल यह समझना चाहता हूं कि समस्या कहां है।
कोई कारण है कि आप 'थ्रेड' के साथ 'कार्य' को मिला रहे हैं? – Groo
'var tcs = new taskCompletionSource
@ मूल कोड में ग्रूओ एक लंबे समय से चलने वाला धागा (कार्यकर्ता) है जो मिश्रण कार्यों के बिना कई नौकरियां करता है। हालांकि, कार्यकर्ता/थ्रेड शुरू करने के लिए खुलासा करने वाला एक प्रतीक्षा योग्य कार्य है जो कुछ शुरुआती नौकरी के दौरान पूरा हो जाता है। –