नीचे दिए गए कोड में मैं कार्यों की सूची के परिणामों की रिपोर्टिंग सिंक्रनाइज़ करना चाहता हूं। यह अब काम कर रहा है क्योंकि कार्य। कार्य पूरा होने तक परिणाम ब्लॉक। हालांकि, कार्य आईडी = 3 को पूरा करने के लिए लंबा समय लगता है और अन्य सभी समाप्त कार्यों को उनकी स्थिति की रिपोर्ट करने से रोकता है।यूआई थ्रेड के बिना कार्य सिंक्रनाइज़ेशन
मुझे लगता है कि मैं रिपोर्टिंग (कंसोल। राइट) को एक में ले जाकर ऐसा कर सकता हूं। निर्देश के साथ, लेकिन मेरे पास यूआई थ्रेड नहीं है, तो मैं कार्य को सिंक्रनाइज़ करने के लिए टास्कशेड्यूलर कैसे प्राप्त करूं? कार्यों के साथ?
क्या मैं अब है:
static void Main(string[] args)
{
Console.WriteLine("Starting on {0}", Thread.CurrentThread.ManagedThreadId);
var tasks = new List<Task<int>>();
for (var i = 0; i < 10; i++)
{
var num = i;
var t = Task<int>.Factory.StartNew(() =>
{
if (num == 3)
{
Thread.Sleep(20000);
}
Thread.Sleep(new Random(num).Next(1000, 5000));
Console.WriteLine("Done {0} on {1}", num, Thread.CurrentThread.ManagedThreadId);
return num;
});
tasks.Add(t);
}
foreach (var task in tasks)
{
Console.WriteLine("Completed {0} on {1}", task.Result, Thread.CurrentThread.ManagedThreadId);
}
Console.WriteLine("End of Main");
Console.ReadKey();
}
मैं इस या कुछ इसी तरह करने के लिए स्थानांतरित करना चाहते हैं, लेकिन मैं Console.Write ("पूर्ण ...") सभी के लिए एक ही धागे पर होने की जरूरत है:
static void Main(string[] args)
{
Console.WriteLine("Starting on {0}", Thread.CurrentThread.ManagedThreadId);
for (var i = 0; i < 10; i++)
{
var num = i;
Task<int>.Factory.StartNew(() =>
{
if (num == 3)
{
Thread.Sleep(20000);
}
Thread.Sleep(new Random(num).Next(1000, 10000));
Console.WriteLine("Done {0} on {1}", num, Thread.CurrentThread.ManagedThreadId);
return num;
}).ContinueWith(value =>
{
Console.WriteLine("Completed {0} on {1}", value.Result, Thread.CurrentThread.ManagedThreadId);
}
/* need syncronization context */);
}
Console.WriteLine("End of Main");
Console.ReadKey();
}
- समाधान - कुछ टिप्पणियां हो रही है और समाधान के कुछ पढ़ने के लिए इस पूर्ण समाधान है करता है कि मैं क्या चाहते हैं के बाद। लक्ष्य यहां जितना तेज़ हो सके लंबे समय तक चलने वाले कार्यों को संसाधित करना है और फिर एक समय में प्रत्येक कार्य के परिणामों के साथ कुछ करें।
static void Main(string[] args)
{
Console.WriteLine("Starting on {0}", Thread.CurrentThread.ManagedThreadId);
var results = new BlockingCollection<int>();
Task.Factory.StartNew(() =>
{
while (!results.IsCompleted)
{
try
{
var x = results.Take();
Console.WriteLine("Completed {0} on {1}", x, Thread.CurrentThread.ManagedThreadId);
}
catch (InvalidOperationException)
{
}
}
Console.WriteLine("\r\nNo more items to take.");
});
var tasks = new List<Task>();
for (var i = 0; i < 10; i++)
{
var num = i;
var t = Task.Factory.StartNew(() =>
{
if (num == 3)
{
Thread.Sleep(20000);
}
Thread.Sleep(new Random(num).Next(1000, 10000));
Console.WriteLine("Done {0} on {1}", num, Thread.CurrentThread.ManagedThreadId);
results.Add(num);
});
tasks.Add(t);
}
Task.Factory.ContinueWhenAll(tasks.ToArray(), _ => results.CompleteAdding());
Console.WriteLine("End of Main");
Console.ReadKey();
}
मुझे लगता है कंसोल धागा एक खड़े में एक जीयूआई के लिए है (WinForms/WPF)। जो एक अच्छा विचार नहीं है, एक डिस्पैचर/Messageloop की उपस्थिति एक (बड़ा) अंतर बनाता है। –
अन्यथा, "उसी धागे पर होने" के साथ आपका क्या मतलब है इसके बारे में सोचें। तब तक ऐसा नहीं कर सकता जब तक वह धागा मतदान न हो। –
मुझे इसे बदलने की ज़रूरत है ताकि एक ही समय में जारी रखने वाले कार्यों में से एक ही चल सके। इससे कोई फर्क नहीं पड़ता कि वे एक ही धागे पर चलते हैं या नहीं, लेकिन मैं उनमें से दो समानांतर में नहीं चल सकता। वास्तविक जीवन में मैं जारी रखता हूं भाग के साथ डेटाबेस में बहुत सारे डेटा लिख रहे हैं। –