我的后台工作程序阻塞主线程c#

问题描述 投票:-1回答:1

我正在尝试使用c#file up-loader上传许多文件,并允许用户在中间停止进程,因此我创建了后台工作程序以在其上运行上载但是取消按钮不起作用(它在所有文件上传后触发)和WorkerThread_ProgressChanged不会影响UI元素,标签文本也不会改变,这是我的代码

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();
}
c# backgroundworker
1个回答
-1
投票

这种情况称为竞争条件,是多线程编程中的常见问题。有关多线程设计问题的更多信息,请参阅Managed Threading Best Practices

© www.soinside.com 2019 - 2024. All rights reserved.