мой фоновый рабочий блокирует основной поток c # - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь загрузить много файлов, используя загрузчик файлов c # и позволяя пользователю остановить процесс в середине, поэтому я создаю backgroundworker для запуска загрузки на него, но кнопка отмены не работает (она срабатывает после всех файловзагружен), и WorkerThread_ProgressChanged не влияет на элементы пользовательского интерфейса, текст метки не изменяется, и это мой код

protected void cancelupload_Click(object sender, EventArgs e)
{

    workerThread.CancelAsync();
    if (workerThread.CancellationPending)
    {
    }


}

private void WorkerThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    Uploadpercentage.Text= "Uploading... (" + e.ProgressPercentage + "%)";
}
private void WorkerThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
    {
        // lblStopWatch.Text = "Cancelled";
    }
    else
    {
        //  lblStopWatch.Text = "Stopped";
    }
}
private void WorkerThread_DoWork(object sender, DoWorkEventArgs e)
{
    DateTime startTime = DateTime.Now;
    _keepRunning = true;
    List<KeyValuePair<string, string>> Unuploaded_files = new List<KeyValuePair<string, string>>() { };
    int count = 0;
    while (_keepRunning && count < fileCollection.Count)
    {

        HttpPostedFile uploadfile = fileCollection[count];
        String fileName = Path.GetFileName(uploadfile.FileName);
        string fileExxtension = Path.GetExtension(uploadfile.FileName);
        if (ValidExtensions.Contains(fileExxtension))
        {
            if (File.Exists(Chosen_Site_Path + @"\" + Selected_folder_name.SelectedItem.Text + @"\" + fileName))
        {
            KeyValuePair<string, string> Unuploaded_file = new KeyValuePair<string, string>(fileName, "Another file exists with the same name!");
            Unuploaded_files.Add(Unuploaded_file);
        }
        else
        {
            uploadfile.SaveAs(Chosen_Site_Path + @"\" + Selected_folder_name.SelectedItem.Text + @"\" + fileName);
            log.INSERT_ACTIVITY_LOG(Session["User_PK"].ToString(), Session["User_Type"].ToString(), "Uploader Home Page : Uploaded " + fileName + "Selected site " + BASF_SITE_ID);
            log.INSERT_SITE_HISTORY(Session["User_PK"].ToString(), BASF_SITE_ID, "Uploaded file: " + fileName);
        }
    }
        else
        {
        KeyValuePair<string, string> Unuploaded_file = new KeyValuePair<string, string>(fileName, "File type is not allowed");
        Unuploaded_files.Add(Unuploaded_file);

    }
    count++;

        string timeElapsedInstring = (DateTime.Now - startTime).ToString(@"hh\:mm\:ss");

        int percent = (int)(((Decimal)count / fileCollection.Count ) *100);
        workerThread.ReportProgress(percent, timeElapsedInstring);

        if (workerThread.CancellationPending)
        {
            // this is important as it set the cancelled property of RunWorkerCompletedEventArgs to true
            e.Cancel = true;
            break;
        }
    }
    if (Unuploaded_files.Count == 0)
    {

        string message = "alert('Files Uploaded')";
        ScriptManager.RegisterClientScriptBlock(submitupload, this.GetType(), "alert", message, true);
    }
    else
    {
        string msg = "UNUPLOADED FILES:" + @"\" + "n";
        for (int i = 0; i < Unuploaded_files.Count; i++)
        {
            msg += Unuploaded_files[i].Key + ": " + Unuploaded_files[i].Value + @"\" + "n";
        }
        string alertmsg = "alert('" + msg + "')";
        ScriptManager.RegisterClientScriptBlock(submitupload, this.GetType(), "alert", alertmsg, true);
    }
    viewSites();
}

1 Ответ

0 голосов
/ 13 февраля 2019

Эта ситуация называется состоянием гонки и является общей проблемой в многопоточном программировании.Для получения дополнительной информации о проблемах проектирования многопоточности см. Рекомендации по управляемой многопоточности .

...