Поток wpf, поток должен быть STA - PullRequest
0 голосов
/ 11 декабря 2011

У меня есть окно (скажем, главное окно) с рамкой, в которой есть страница. Кнопка на странице открывает другое окно (скажем, всплывающее окно). Теперь я пытаюсь вызвать метод в главном окне с помощью кнопки во всплывающем окне. Метод должен быть многопоточным, у меня было похожее решение, работающее в формах Windows, но я продолжаю получать вызывающий поток должен быть STA, потому что многие компоненты пользовательского интерфейса требуют этого в 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)
        {

         }

Также я хочу заполнить сетку из результата метода тиков, это будет циклически повторяться в фоновом режиме, но периодически возвращать данные, которые будут добавлены в сетку. Должен ли я сделать это в событии обновления прогресса? Я много пытался обернуть голову вокруг диспетчера и фонового работника в wpf, но я не понимаю бит состояния STA. Если кто-то может помочь мне запустить мой метод тиков или указать правильное направление, я был бы очень очень благодарен.

1 Ответ

0 голосов
/ 05 апреля 2012

Что ж, я наконец-то смог решить проблему с потоком 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;
        .
        .
        .
     }
...