У меня возникли некоторые проблемы при попытке отменить Фоноверто. Я читал десятки аналогичных тем, таких как How to stop BackgroundWorker correctly, How to wait correctly until BackgroundWorker completes?, но я никуда не денусь.Фоновый рабочий отменить рабочего
Что происходит, так это то, что у меня есть приложение C#, которое использует PHP WebService для отправки информации в базу данных MySQL. Если пользователь по какой-то причине, щелчки (в форме) на «назад» или «стоп» кнопку, это код, который обжигают:
BgWorkDocuments.CancelAsync();
BgWorkArticles.CancelAsync();
Я понимаю, что запрос Asynchronous
, поэтому отмена может занять 1 или 2 секунды, но она должна прекратиться ... и этого не происходит вообще. Даже после нажатия «назад» (текущая форма закрыта и открывается новая), рабочий стол продолжает работать, потому что я все время вижу данные, вставленные в MySQL.
foreach (string[] conn in lines)
{
string connectionString = conn[0];
FbConnection fbConn = new FbConnection(connectionString);
fbConn.Open();
getDocuments(fbConn);
// Checks if one of the backgrounds is currently busy
// If it is, then keep pushing the events until stop.
// Only after everything is completed is when it's allowed to close the connection.
//
// OBS: Might the problem be here?
while (BgWorkDocuments.IsBusy == true || BgWorkArticles.IsBusy == true)
{
Application.DoEvents();
}
fbConn.Close();
}
Этот код необходим, потому что у меня может быть несколько баз данных, поэтому у меня есть цикл.
private void getDocuments(FbConnection fbConn)
{
BgWorkDocuments.RunWorkerAsync();
BgWorkDocuments.DoWork += (object _sender, DoWorkEventArgs args) =>
{
DataTable dt = getNewDocuments(fbConn);
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
// Checks if the user has stopped the background worker
if (BgWorkDocuments.CancellationPending == false)
{
// Continue doing what has to do..
sendDocumentsToMySQL((int)dt.Rows[i]["ID"]);
}
}
// After the previous loop is completed,
// start the new backgroundworker
getArticles(fbConn);
};
}
private void getArticles(FbConnection fbConn)
{
BgWorkArticles.RunWorkerAsync();
BgWorkArticles.DoWork += (object _sender, DoWorkEventArgs args) =>
{
DataTable dt = getNewArticles(fbConn);
for (int i = 0; i <= dt.Rows.Count - 1; i++)
{
// Checks if the user has stopped the background worker
if (BgWorkArticles.CancellationPending == false)
{
// Continue doing what has to do..
sendArticlesToMySQL((int)dt.Rows[i]["ID"]);
}
}
};
}
Вы запускаете второй поток независимо от того, что происходит во время первого. Таким образом, отмена во время 'getDocuments()' не будет препятствовать запуску 'getArticles()'. Вам нужно 'return' в вызове' getDocument() '? – DonBoitnott
И потерять вызов DoEvents() ... это плохая идея. Найдите другой способ обновления, если это то, что вам нужно. – DonBoitnott
Я согласен с вами, и я изменил код, который проверяет, отменено ли это: http://pastebin.com/3uEfNZqa, тот же код (изменяющий только имя фонового рабочего) был применен и к getArticles(). но проблема сохраняется. – Linesofcode