Официальный сайт студ.городка НГТУ
Программирование и БД » c# multithreading поясните пример 

#1  30.11.12 17:17

c# multithreading поясните пример

Код: c#:

 
namespace WindowsFormsApplication1
{
    public class MainForm : Form
    {
        private TypeWithAsync _type;
 
        [STAThread()]
        public static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MainForm());
        }
 
        public MainForm()
        {
            _type = new TypeWithAsync();
            _type.DoSomethingCompleted += DoSomethingCompleted;
 
            var panel = new FlowLayoutPanel() { Dock = DockStyle.Fill };
 
            var btn = new Button() { Text = "Synchronous" };
            btn.Click += SyncClick;
            panel.Controls.Add(btn);
 
            btn = new Button { Text = "Asynchronous" };
            btn.Click += AsyncClick;
            panel.Controls.Add(btn);
 
            Controls.Add(panel);
        }
 
        private void SyncClick(object sender, EventArgs e)
        {
            int value = _type.DoSomething();
            MessageBox.Show(string.Format("DoSomething() returned {0}.", value));
        }
 
        private void AsyncClick(object sender, EventArgs e)
        {
            _type.DoSomethingAsync();
        }
 
        private void DoSomethingCompleted(object sender, DoSomethingCompletedEventArgs e)
        {
            MessageBox.Show(string.Format("DoSomethingAsync() returned {0}.", e.Value));
        }
    }
 
 
    public class DoSomethingCompletedEventArgs : EventArgs
    {
        private int _value;
 
        public DoSomethingCompletedEventArgs(int value)
            : base()
        {
            _value = value;
        }
 
        public int Value
        {
            get { return _value; }
        }
    }
 
    class TypeWithAsync
    {
        private AsyncOperation _operation;
 
        // synchronous version of method
        public int DoSomething()
        {
            Thread.Sleep(5000);
            return 27;
        }
 
        // async version of method
        public void DoSomethingAsync()
        {
            if (_operation != null)
            {
                throw new InvalidOperationException("An async operation is already running.");
            }
 
            _operation = AsyncOperationManager.CreateOperation(null);
            ThreadPool.QueueUserWorkItem(DoSomethingAsyncCore);
        }
 
 
//ВОТ ОТСЮДА НЕПОНЯТНО И ДО КОНЦА КЛАССА
 
 
       // wrapper used by async method to call sync version of method, matches WaitCallback so it
        // can be queued by the thread pool
        private void DoSomethingAsyncCore(object state)
        {
            int returnValue = DoSomething();
            var e = new DoSomethingCompletedEventArgs(returnValue);
            _operation.PostOperationCompleted(RaiseDoSomethingCompleted, e);
        }
 
        // wrapper used so async method can raise the event; matches SendOrPostCallback
        private void RaiseDoSomethingCompleted(object args)
        {
            OnDoSomethingCompleted((DoSomethingCompletedEventArgs)args);
        }
 
        private void OnDoSomethingCompleted(DoSomethingCompletedEventArgs e)
        {
            var handler = DoSomethingCompleted;
 
            if (handler != null) { handler(this, e); }
        }
 
        public EventHandler<DoSomethingCompletedEventArgs> DoSomethingCompleted;
    }
 
}
 

http://stackoverflow.com/questions/6184 … hread-safe

Вопрос, что тут происходит, куда копать?
Или еще хотелось бы узнать, есть несколько объектов моего класса, запущенные в рабочем потоке, как пельмени в закрытой кастрюле. Как из каждого своего класса/объекта, запущенного в рабочем потоке передать событие об изменении своего состояния в основной поток? (Invoke и его родственники, как я понял, работают только в пределах одного класса.)

Исправлено drug_detei (30.11.12 18:21)

Offline

#2  20.02.13 01:25

Re: c# multithreading поясните пример

Какая версия .нет?

Offline

#3  26.02.13 14:38

Re: c# multithreading поясните пример

XuMiX, разобрался уже, вот здесь таинство передачи переменной в основной поток

private void OnDoSomethingCompleted(DoSomethingCompletedEventArgs e)
        {
            var handler = DoSomethingCompleted;

            if (handler != null) { handler(this, e); }
        }

        public EventHandler<DoSomethingCompletedEventArgs> DoSomethingCompleted;

Когда твои новые статьи можно будет на хабре почитать? )

Исправлено drug_detei (26.02.13 17:17)

Offline

Программирование и БД » c# multithreading поясните пример 

ФутЕр:)

© Hostel Web Group, 2002-2025.   Сообщить об ошибке

Сгенерировано за 0.432 сек.
Выполнено 11 запросов.