简体   繁体   中英

my background worker block the main thread c#

I am trying to upload many files Using c# file up-loader and enable the user to stop the process in the middle so I create backgroundworker to run upload on it but the cancellation button does not work (it fires after all the files is uploaded)and WorkerThread_ProgressChanged does not affect UI elements and the label text doesnot change and this is my code

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();
}

This situation is called a race condition and is a common concern in multithreaded programming. For more information about multithreading design issues, see Managed Threading Best Practices .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM