.NET 4.5.1: ऐसा प्रतीत होता है, मैं रद्द करने के लिए रद्द किए गए एक ब्लॉकिंग विधि को रद्द नहीं कर सकता, रद्द किए गए टाइमआउट स्रोत का उपयोग कर।सी #: रद्दीकरण टोकन ब्लॉकिंग विधि को रद्द नहीं करता है
class Program
{
static void Main(string[] args)
{
var cts = new System.Threading.CancellationTokenSource();
System.Console.CancelKeyPress += (s, e) =>
{
e.Cancel = true;
cts.Cancel();
};
MainAsync(args, cts.Token).Wait();
}
// MainAsync from http://stackoverflow.com/questions/9208921/async-on-main-method-of-console-app
static async Task MainAsync(string[] args, System.Threading.CancellationToken token)
{
Console.WriteLine("Starting MainAsync");
var cts = new System.Threading.CancellationTokenSource(3000);
var task = Task.Factory.StartNew(() =>
{
Console.WriteLine("Starting task...");
var t = new System.Net.Sockets.TcpClient();
var buffer = new byte[t.ReceiveBufferSize];
t.Connect(new System.Net.IPEndPoint(System.Net.IPAddress.Parse("127.0.0.1"), 1337));
Console.WriteLine("Recieving...");
t.Client.Receive(buffer);
Console.WriteLine("Finished Recieving...");
return true;
}, cts.Token);
var success = await task;
Console.WriteLine("Did the task complete succesfuly?", success);
}
}
निहित, सही उदाहरण (मुझे आशा है कि यह सही है) के ऊपर कम, स्व से उत्पादन होता है:
Starting MainAsync
Starting task...
Recieving...
कार्य क्यों रद्द नहीं करता है, कोई अपवाद नहीं फेंक दिया जाता है?
सॉकेट.रेसीव का उपयोग करके आप यहां उपयोग कर रहे हैं एक अवरोधक कॉल है - आपको एक टाइमआउट या एसिंक उपयोग प्रदान करना चाहिए ताकि आप प्रसंस्करण के दौरान रद्दीकरण को फिर से मूल्यांकन कर सकें। रद्दीकरण टोकन आपके लिए अवरुद्ध कॉल को जादुई रूप से समाप्त नहीं करेगा। – Joe