Я читал статьи о MSDN, но мой ум мертв (это обычно происходит, когда я прочитал MSDN (Никакое преступление, MSDN, но Ваши статьи время от времени смущает меня.)), и я пытаюсь сделать некоторую "фоновую работу" в моем приложении, но не уверенный как. Это - просто отдельный метод. Но приложение зависает, и я должен дождаться к 1 - 3 минутам для него для становления... неповешенным?
Есть ли какие-либо простые примеры, которые кладут вокруг онлайн где-нибудь, что я могу взглянуть на приблизительно с?
Спасибо всем
Уже существует этот достойный вопрос с множеством ссылок на статьи, которые легче усваиваются, чем MSDN.
Статья Джона Скита - самая простая и, вероятно, самая исчерпывающая для начала, а серия Джо Даффи очень глубока. Просмотр тегов C # и многопоточности в Stackoverflow также даст вам несколько хороших ответов.
Вы можете избежать BackgroundWorker
самым быстрым способом начать работу и просто использовать Invoke:
void ButtonClick(object sender,EventArgs e)
{
Thread thread = new Thread(Worker);
thread.Start();
}
void Worker()
{
if (InvokeRequired)
{
Invoke(new Action(Worker));
return;
}
MyLabel.Text = "Done item x";
}
Некоторым людям нравится использовать BackgroundWorker в Stackoverflow, другим - нет (я в лагере номер 2).
Дарин уже рассказал вам теорию.
Но вам стоит ознакомиться со статическим методом ThreadPool.QueueUserWorkItem
. Он более удобен.
Джон Скит написал хорошее введение в многопоточность в .NET , которое вы могли бы прочитать. Он также охватывает многопоточность в WinForms . Это может быть между строк:
public partial class Form1 : Form
{
private BackgroundWorker _worker;
public Form1()
{
InitializeComponent();
_worker = new BackgroundWorker();
_worker.DoWork += (sender, e) =>
{
// do some work here and calculate a result
e.Result = "This is the result of the calculation";
};
_worker.RunWorkerCompleted += (sender, e) =>
{
// the background work completed, we may no
// present the result to the GUI if no exception
// was thrown in the DoWork method
if (e.Error != null)
{
label1.Text = (string)e.Result;
}
};
_worker.RunWorkerAsync();
}
}