C# Wpf多线程

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

这是我的密码。我想在tabControl中添加多线程tabitem。但是我得到“调用线程无法访问此对象,因为另一个线程拥有它。”错误出现在“问题就在这里”的位置

我的另一个问题:
名为
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另一个问题。