मैं एक Winforms आवेदन में निम्न समस्या को ट्रैक करने की कोशिश कर रहा है मुख्य यूआई पर निरंतरता में रिक्त है मुख्य धागा (मुझे उम्मीद है कि वर्तमान सिंक्रनाइज़ेशन संदर्भ System.Windows.Forms.WindowsFormsSynchronizationContext
होना चाहिए)।SynchronizationContext.Current धागा
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
TaskScheduler ts = TaskScheduler.FromCurrentSynchronizationContext(); // Get the UI task scheduler
// This line is required to see the issue (Removing this causes the problem to go away), since it changes the codeflow in
// \SymbolCache\src\source\.NET\4\DEVDIV_TFS\Dev10\Releases\RTMRel\ndp\clr\src\BCL\System\Threading\ExecutionContext.cs\1305376\ExecutionContext.cs
// at line 435
System.Diagnostics.Trace.CorrelationManager.StartLogicalOperation("LogicalOperation");
var task = Task.Factory.StartNew(() => { });
var cont = task.ContinueWith(MyContinueWith, CancellationToken.None, TaskContinuationOptions.None, ts);
System.Diagnostics.Trace.CorrelationManager.StopLogicalOperation();
}
void MyContinueWith(Task t)
{
if (SynchronizationContext.Current == null) // The current SynchronizationContext shouldn't be null here, but it is.
MessageBox.Show("SynchronizationContext.Current is null");
}
}
}
इस के बाद से मैं निरंतरता से BackgroundWorker
उपयोग करने का प्रयास है, और BackgroundWorker अपने आयोजनों RunWorkerCompleted
और ProgressChanged
के लिए वर्तमान SynchronizationContext का उपयोग करेगा मेरे लिए एक मुद्दा है:
यहाँ मुद्दा प्रदर्शन Winforms कोड है। चूंकि जब मैं पृष्ठभूमि वर्कर को लात मारता हूं, तो मौजूदा सिंक्रनाइज़ेशन कॉन्टेक्स्ट शून्य है, इसलिए ईवेंट मुख्य ui थ्रेड पर नहीं चलता है जैसा कि मेरा इरादा है।
मेरा प्रश्न:
इस माइक्रोसॉफ्ट के कोड में एक बग है, या मैं एक गलती कहीं बना दिया है?
अतिरिक्त जानकारी:
- मैं नेट 4.0 उपयोग कर रहा हूँ (मैं अभी तक .NET 4.5 आर सी पर इस प्रयास नहीं किया है)
- मैं किसी पर दोनों डीबग/रिलीज पर इस पुन: पेश कर सकते हैं x86/x64/कोई भी CPU (x64 मशीन पर)।
- यह लगातार पुन: उत्पन्न करता है (अगर कोई इसे पुन: उत्पन्न नहीं कर सकता है तो मुझे दिलचस्पी होगी)।
- मैं BackgroundWorker का उपयोग करता है विरासत कोड है - तो मैं नहीं आसानी से उपयोग नहीं कर BackgroundWorker
- मुझे लगता है कि
MyContinueWith
में कोड मुख्य ui धागा पर चल रहा है की पुष्टि की है करने के लिए बदल सकते हैं। - मुझे नहीं पता कि
StartLogicalOperation
कॉल समस्या का कारण बनने में मदद करता है, यही वह है जो मैंने इसे अपने आवेदन में सीमित कर दिया है।
ठीक है, आपको उस लिंक से निदान मिला है। क्या आप इस विनफॉर्म ऐप में डब्ल्यूपीएफ या डब्ल्यूसीएफ कोड भी मिला रहे हैं? –
नहीं - केवल Winforms। –