मुझे पता है कि SO पर इस विषय पर कुछ जवाब हैं, लेकिन मुझे मेरे लिए कोई भी समाधान काम नहीं मिल रहा है। मैं एक आईमैमंड से एक नई खिड़की खोलने की कोशिश कर रहा हूं, जो डाटामैप्लेट के भीतर से निकाल दिया गया है। दोनों निम्नलिखित ऊपर उल्लिखित त्रुटि जब नई विंडो ("नया MessageWindowP" के भीतर) instantiated है:"कॉलिंग थ्रेड एसटीए होना चाहिए" वर्कअराउंड
TPL/FromCurrentSynchronizationContext का उपयोगअद्यतन: काम करता है
public class ChatUserCommand : ICommand
{
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
var scheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(new Action<object>(CreateMessageWindow), user,CancellationToken.None, TaskCreationOptions.None,scheduler);
}
}
private void CreateMessageWindow(object o)
{
var user = (UserC)o;
var messageP = new MessageWindowP();
messageP.ViewModel.Participants.Add(user);
messageP.View.Show();
}
}
ThreadStart का उपयोग करना:अद्यतन: अनुशंसित नहीं है, जॉन का जवाब देखें
public class ChatUserCommand : ICommand
{
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
var t = new ParameterizedThreadStart(CreateMessageWindow);
var thread = new Thread(t);
thread.SetApartmentState(ApartmentState.STA);
thread.Start(sender);
}
}
private void CreateMessageWindow(object o)
{
var user = (UserC)o;
var messageP = new MessageWindowP();
messageP.ViewModel.Participants.Add(user);
messageP.View.Show();
}
}
धन्यवाद
संपादित करें। प्रतिक्रियाओं के आधार पर, मैं यह इंगित करना चाहता हूं कि मैंने वर्तमान प्रेषक पर BeginInvoke की कोशिश की है, साथ ही साथ मूल विधि में कोड निष्पादित किया है (इस प्रकार कोड शुरू हुआ)। नीचे देखें:
BeginInvokeअद्यतन: नहीं की सिफारिश की देख जॉन की जवाब
public class ChatUserCommand : ICommand
{
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
Dispatcher.CurrentDispatcher.BeginInvoke(new Action<object>(CreateMessageWindow), sender);
}
}
private void CreateMessageWindow(object o)
{
var user = (UserC)o;
var messageP = new MessageWindowP();
messageP.ViewModel.Participants.Add(user);
messageP.View.Show();
}
}
एक ही धागे मेंअद्यतन: काम करता है अगर आप पहले से
public class ChatUserCommand : ICommand
{
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
var messageP = new MessageWindowP();
messageP.ViewModel.Participants.Add(user);
messageP.View.Show();
}
}
}
यूआई धागे पर हैं BeginInvoke, पहले/मुख्य वाई के प्रेषक के संदर्भ में ndowअद्यतन: काम करता है
public void Execute(object sender)
{
if (sender is UserC)
{
var user = (UserC)sender;
GeneralManager.MainDispatcher.BeginInvoke(
DispatcherPriority.Normal,
new Action(() => this.CreateMessageWindow(user)));
}
}
जहां GeneralManager.MainDispatcher पहले खिड़की मैं बनाने की डिस्पैचर के लिए एक संदर्भ है: एक नुकसान में
[somewhere far far away]
mainP = new MainP();
MainDispatcher = mainP.View.Dispatcher;
मैं कर रहा हूँ।
और उसी धागे और 'BeginInvoke' में कॉल करने में समस्या क्या थी? आपके थ्रेड में कौन सा धागा चलता है? – Vlad
आप यहां 'डिस्पैचर.कुरेंट डिस्पैचर' का उपयोग नहीं कर सकते जैसे आप यहां करते हैं। मेरे उत्तर में अपडेट देखें। – Jon
दोस्तों। अभी भी कोई भाग्य नहीं है ... :(फिर से अपडेट देखें। –