C# Wpf多线程
这是我的密码。我想在tabControl中添加多线程tabitem。但是我得到“调用线程无法访问此对象,因为另一个线程拥有它。”错误出现在“问题就在这里”的位置 我的另一个问题:C# Wpf多线程,c#,wpf,multithreading,async-await,ui-thread,C#,Wpf,Multithreading,Async Await,Ui Thread,这是我的密码。我想在tabControl中添加多线程tabitem。但是我得到“调用线程无法访问此对象,因为另一个线程拥有它。”错误出现在“问题就在这里”的位置 我的另一个问题: 名为ti的TabItem不是在UI线程上创建的。 您应该在UI线程上创建它,这样您就可以像这样包装它: UserControls.userGridGunler ug = new UserControls.userGridGunler();//My user control ug.Basliklar.ItemsSourc
名为
ti
的TabItem
不是在UI线程上创建的。
您应该在UI线程上创建它,这样您就可以像这样包装它:
UserControls.userGridGunler ug = new UserControls.userGridGunler();//My user control
ug.Basliklar.ItemsSource = basliklar;
ug.Saatler.ItemsSource = saha.Satirlar;
TabItem ti = new TabItem();
ti.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate
{
ti.Header = saha.SahaAdı + " (" + saha.SahaTipi + ")";
ti.Content = ug;
});
//tabSahalar is my TabControl in mainWindow
tabSahalar.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate
{
tabSahalar.Items.Add(ti);//PROBLEM IS HERE
//tabSahalar.Items.Add(new TabItem { Header = "asdasdad" });//Problem no here
});
名为
ti
的TabItem
不是在UI线程上创建的。
您应该在UI线程上创建它,这样您就可以像这样包装它:
UserControls.userGridGunler ug = new UserControls.userGridGunler();//My user control
ug.Basliklar.ItemsSource = basliklar;
ug.Saatler.ItemsSource = saha.Satirlar;
TabItem ti = new TabItem();
ti.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate
{
ti.Header = saha.SahaAdı + " (" + saha.SahaTipi + ")";
ti.Content = ug;
});
//tabSahalar is my TabControl in mainWindow
tabSahalar.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate
{
tabSahalar.Items.Add(ti);//PROBLEM IS HERE
//tabSahalar.Items.Add(new TabItem { Header = "asdasdad" });//Problem no here
});
与您的任务相关的WPF
应用程序中多线程功能的简单(但不一定是最佳)实现如下所示:
TabItem ti = null;
Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate
{
ti = new TabItem();
ti.Header = saha.SahaAdı + " (" + saha.SahaTipi + ")";
ti.Content = ug;
});
假设您在XAML中放置了TabControl1
,此代码将动态添加另一个TabItem
ti
,并使用async
和wait
编码技术在异步模式下设置其标题/内容属性。在现实生活中的应用程序中,它可能应该封装在按钮中。单击事件处理程序或类似的东西(一般来说,异步void
主要用于UI事件处理)
希望这会有所帮助。与您的任务相关的WPF
应用程序中多线程功能的简单(但不一定是最佳)实现如下所示:
TabItem ti = null;
Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, (Action)delegate
{
ti = new TabItem();
ti.Header = saha.SahaAdı + " (" + saha.SahaTipi + ")";
ti.Content = ug;
});
假设您在XAML中放置了TabControl1
,此代码将动态添加另一个TabItem
ti
,并使用async
和wait
编码技术在异步模式下设置其标题/内容属性。在现实生活中的应用程序中,它可能应该封装在按钮中。单击事件处理程序或类似的东西(一般来说,异步void
主要用于UI事件处理)
希望这能有所帮助。@EngineerSpock通过电子邮件解决了我的问题
问题在于我的用户控件durumButon
新代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// this simulates some User event, e.g. Button click
AddMyTabItem();
}
// in real-life app this could be replaced w/event handler
private async void AddMyTabItem()
{
try
{
TabItem ti = new TabItem();
ti.Header = "MyTableItemHeader";
ti.Content = "MyTableItemContent";
await AddTabItem(ti);
}
catch { }
}
// implements async/await asynchronous for responsive UI
private async Task AddTabItem(TabItem TI)
{
try
{
await TabControl1.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate
{
TabControl1.Items.Add(TI);
});
}
catch { throw; }
}
}
我添加Application.Current.Dispatcher.Invoke(新操作(()=>{}))代码块,我的问题已解决。@EngineerSpock通过电子邮件解决了我的问题
问题在于我的用户控件durumButon
新代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// this simulates some User event, e.g. Button click
AddMyTabItem();
}
// in real-life app this could be replaced w/event handler
private async void AddMyTabItem()
{
try
{
TabItem ti = new TabItem();
ti.Header = "MyTableItemHeader";
ti.Content = "MyTableItemContent";
await AddTabItem(ti);
}
catch { }
}
// implements async/await asynchronous for responsive UI
private async Task AddTabItem(TabItem TI)
{
try
{
await TabControl1.Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)delegate
{
TabControl1.Items.Add(TI);
});
}
catch { throw; }
}
}
我添加Application.Current.Dispatcher.Invoke(新操作(()=>{}))代码块和我的问题已经解决。你的问题是非常常见的UI在一个线程上,你不能从另一个线程上玩它-请用谷歌搜索,并查看堆栈溢出,有很多问题请查看侧栏标题“相关”,这里已经列出了几个有趣的答案-我们可能会将这个问题作为一个重复来结束?在调用操作中创建TabItem(ti=new TabItem();
)。@CaKaL您可以通过电子邮件将解决方案发送给我吗?@EngineerSpock为什么不可以?您的电子邮件地址?您的问题是,非常常见的用户界面位于一个线程上,您无法从另一个线程使用它-请使用谷歌搜索,并查看堆栈溢出,其中有大量内容请参见侧边栏,标题为“相关”,这里已经列出了几个有趣的答案-我们可能会将这个问题作为一个重复来结束?在调用操作中创建TabItem(ti=new TabItem();
)。@CaKaL您可以通过电子邮件将解决方案发送给我吗?@EngineerSpock为什么不可以?您的电子邮件地址?此代码有“对象引用未设置为对象实例”错误。因为ti=null。@CaKaL很抱歉,应该有Application.Current.Dispatcher.Invoke()。复制并重试。我尝试了此代码,但出现“必须在DependencyObject所在的同一线程上创建DependencySource”错误:(@CaKaL这是另一个问题,尽管类似。basliklar或saha不是在UI线程上创建的。您应该在UI线程上使用相同的技术创建它们-使用Application.Current.Dispatcher。主题的问题已经解决。如果不难,请将其中一个答案标记为答案。我将尝试在注释中帮助您,或者您可以使用c创建另一个问题。此代码有“对象引用未设置为对象的实例”错误。因为ti=null。@CaKaL很抱歉,应该有Application.Current.Dispatcher.Invoke()。请复制并重试。我尝试了此代码,但得到“必须在与DependencyObject相同的线程上创建DependencySource”错误:(@CaKaL这是另一个问题,尽管类似。basliklar或saha不是在UI线程上创建的。您应该在UI线程上使用相同的技术创建它们-使用Application.Current.Dispatcher。主题的问题已经解决。如果不难,请将其中一个答案标记为答案。我将尝试在注释中帮助您,或者您可以使用c另一个问题。