【问题标题】:wpf threading, thread must be STAwpf线程,线程必须是STA
【发布时间】:2012-04-05 06:54:04
【问题描述】:

我有一个带有框架的窗口(比如主窗口),其中有一个页面。页面上的按钮打开另一个窗口(比如弹出窗口)。现在我正在尝试从弹出窗口上的按钮调用主窗口中的方法。该方法必须是多线程的,我在 Windows 窗体中运行了类似的解决方案,但我不断得到调用线程必须是 STA,因为许多 UI 组件在 WPF 中需要这个。

页面上以模态方式打开弹窗的方法

Scripts showStocks = new Scripts();
            showStocks.ShowInTaskbar = false;
            showStocks.ShowDialog();
            if (showStocks.DialogResult==true)
            {
                Window1 wd1 = new Window1();
                wd1.doneDeal();
            }

这里的 window1 是我们的主窗口。 doneDeal 方法是

public void doneDeal()
        {
            // **Some Code**
            BackgroundWorker wworks1 = new BackgroundWorker();
            wworks1.DoWork += Tickes;
            wworks1.RunWorkerCompleted += Tickes2;
            wworks1.RunWorkerAsync();

           // Page1 pg1 = frame1.Content as Page1;
            //NextPrimeDelegate dd=new NextPrimeDelegate(okreport);
           // pg1.addScriptBtn.Dispatcher.BeginInvoke(DispatcherPriority.Normal,
               // new NextPrimeDelegate(okreport));
            //startStopButton.Dispatcher.BeginInvoke(
                //    DispatcherPriority.Normal,
                //    new NextPrimeDelegate(CheckNextNumber));

            //new Thread(() => Tick(stock, rowID, exchange)) { IsBackground = false }.Start();


        }

最后是我试图在后台运行的方法

public void Tickes(object sender, DoWorkEventArgs e)
        {

         }

我还想从 tickes 方法的结果中填充一个 gridview,这将在后台循环和运行,但会定期返回要添加到网格的数据。我应该在进度更新事件中这样做吗?已经尝试了很多方法来围绕 wpf 中的调度程序和后台工作人员,但我无法理解 STA 公寓状态位。如果有人可以帮助我使用我的 tickes 方法或为我指明正确的方向,我将非常感谢。

【问题讨论】:

  • 你试过直接设置apartment state吗?我认为应该通过Thread 类来完成,它可能在BackgroundWorker 中不可用

标签: wpf multithreading backgroundworker sta


【解决方案1】:

好吧,我终于能够解决 STA 线程问题,我发布答案以防万一将来有人遇到类似问题。

    public void doneDeal()
    {
        if (StockData.flag == 1)
        {
            row1 = table.NewRow();
            row1[col1] = "";
            row1[col2] = "";
            row1[col3] = "";
            row1[col4] = "";
            row1[col5] = "";
            row1[col6] = "";
            row1[col7] = "";
            row1[col8] = "";
            row1[col9] = "";
            row1[col10] = "";
            row1[col11] = "";
            row1[col12] = "";
            table.Rows.Add(row1);
            string stock = StockData.stock;
            int rowID = (table.Rows.Count - 1);
            string exchange = StockData.exchange;
            Thread bh = new Thread(delegate()
            {
                Tick7(stock, rowID, exchange);
            });
            bh.SetApartmentState(ApartmentState.STA);
            bh.IsBackground = true;
            bh.Start();
            StockData.flag = -1;
        }
    }

被调用的 Tick7 方法是这样声明的

    [STAThread]
    public void Tick7(string stock, int rowID, string exchange)
    {

        int rowNum = rowID;
        int counter = -1;

        deletecounter = StockData.deletecounter;
        Thread.CurrentThread.Name = StockData.stock;
        .
        .
        .
     }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    相关资源
    最近更新 更多