Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как выполнить метод в запускающем потоке?


Автор: _hunter 15.5.2009, 18:48
Добрый день.

Возникла необходимость выполнить метод потока в потоке его вызвавшем. Т.е. TestProc1/TestProc2 нужно выполнить в "Main Thread". Но ни первый ни второй метод этого не делают :(
(Как проверяю -- просто ставлю бряки на bool stop и в панельке "Debug Location" смотрю на "Thread")

Код

using System.Threading;

namespace ThreadTest
{
    public class TestThread1
    {
        public delegate void testDelegate ();

        public testDelegate TestDelegate;

        public TestThread1 ()
        {

        }

        public void TestThreadProc ()
        {
            if (TestDelegate != null)
                TestDelegate();
        }
    }

    public class TestThread2
    {
        public delegate void testDelegate ();

        public event testDelegate TestEvent;

        public TestThread2 ()
        {

        }

        public void TestThreadProc ()
        {
            if (TestEvent != null)
                TestEvent();
        }
    }

    class Program
    {
        static void Main (string[] args)
        {
            {
                TestThread1 threadObj1 = new TestThread1();

                Thread thread1 = new Thread(new ThreadStart(threadObj1.TestThreadProc));
                threadObj1.TestDelegate = new TestThread1.testDelegate(TestProc1);
                thread1.Start();
            }

            {
                TestThread2 threadObj2 = new TestThread2();

                Thread thread2 = new Thread(new ThreadStart(threadObj2.TestThreadProc));
                threadObj2.TestEvent += new TestThread2.testDelegate(TestProc2);
                thread2.Start();            
            }
        }

        private static void TestProc1 () 
        {
            bool stop = true;
        }

        private static void TestProc2 ()
        {
            bool stop = true;
        }
    }
}


Можно ли как-то "выбрать" поток в котором будет выполняться код?

С уважением...

Автор: Partizan 15.5.2009, 18:56
_hunter, если .NET 3.5, то при создании объекта, можно получить текущий Dispatcher (из System.Windows.Threading в WindowsBase.dll), а потом вызвать у него Invoke, передав в качестве параметра нужный делегат

Автор: _hunter 15.5.2009, 19:54
2.0 :(

Автор: Partizan 16.5.2009, 15:45
_hunter, можно сделать также как в BackgroundWorker реализовано...создаётся приватный 

private AsyncOperation asyncOperation;

после чего, из второго потока у asyncOperation вызывается метод Post, в который передаётся делегат для выполнения

http://msdn.microsoft.com/en-us/library/system.componentmodel.asyncoperation.post.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)