Попробуйте это.
class Form1: Form
{
public void ButtonWasClicked(object sender, EventArgs e)
{
/* Call the UI's Invoke() method */
this.Invoke((MethodInvoker)delegate()
{
/* Stuff to do.. you can access UI elements too without
* the nasty "Control accessed from another thread.."
* Use BeginInvoke() only if you have code after this section
* that you want the UI to execute without waiting for this
* inner blockto finish.
*/
});
}
}
Относительно BeginInvoke (), он используется, чтобы функция немедленно возвращалась, и выполнялась следующая строка, и так далее, и так далее, не дожидаясь завершения метода.
Разница в том, что если вы создадите поток, у вас будет больше контроля над ним, как и у любого другого потока. Вы столкнетесь с CrossThreadExceptions! Принимая во внимание, что если вы используете IAsyncResult и BeginInvoke (), у вас не будет контроля над потоком выполнения асинхронной операции, поскольку она управляется средой выполнения.
С помощью вызова вы также можете отправлять больше параметров в метод и вызывать метод после завершения операции.
MyDelegateWithTwoParam del = new MyDelegateWithTwoParam(_method);
AsyncCallback callback = new AsyncCallback(_callbackMethod);
IAsyncResult res = del.BeginInvoke(param1, param2, callback, null);
private void _callbackMethod(IAsyncResult iar) {
/* In this method you can collect data that your operation might have returned.
* If MyDelegateWithTwoParam has a return type, you can find out here what i was. */
}
Я широко использовал оба для разработки пользовательского интерфейса. Я бы использовал потоки больше для сервис-подобных объектов. (Представьте себе объект, который остается и прослушивает TCP-соединения) и асинхронные методы для фоновой работы за пользовательским интерфейсом (посмотрите также на BackgroundWorker).
Не беспокойтесь, если первый подход занял лишнюю секунду, чтобы начать: Thread.Abort () не
всегда ваше лучшее решение. Попробуйте _abort flags в вашем коде процесса и заблокируйте его.
Надеюсь, я ответил на вопрос.
Лев Бруццанити