首页 > 解决方案 > .net C# - Winform 在标题栏上出现“未响应”消息后被停用

问题描述

我有一个ClientForm(从MainWindow打开),它有一个搜索按钮,单击该按钮大约需要 12 秒来处理。在搜索过程中,如果用户多次单击该表单,“未响应”文本会出现在其标题栏上,这是可以的,但在搜索完成后,ClientForm将失去焦点或将被停用,而MainWindow将获得焦点 - 这是一个问题

下面是代码片段。

 /// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    // this is a wpf window
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var cf= new ClientForm();
        cf.Show();
    }
}



 // This is a winform 
public partial class ClientForm : Form
{
    public ClientForm()
    {
        InitializeComponent();
    }
    private void Search_Click(object sender, EventArgs e)
    {
        Cursor.Current = Cursors.WaitCursor;
        // Do some processing
        Thread.Sleep(12000);
        Cursor.Current = Cursors.Default;
    }
}

这是.net 框架问题吗?

我没有使用后台线程进行搜索,也没有使用 ShowDialog 来显示表单。想知道如何解决这个问题以及为什么会出现这个问题。

谢谢!!!

标签: c#.netwpfwinforms

解决方案


使用后台线程,我自己的例子

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
            button2.Enabled = false;
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            for (int i = 0; i < 100; i++)
            {
                if (worker.CancellationPending == true)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                
                    backgroundWorker1.ReportProgress(i);
                    Thread.Sleep(100);
                
            }
            }

        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                button1.Enabled = false;
                button2.Enabled = true;
                label1.Text = "Runing...";
                // Start the asynchronous operation.
                backgroundWorker1.RunWorkerAsync();
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            button1.Enabled = true;
            button2.Enabled = false;
            label1.Text = "Complete";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.WorkerSupportsCancellation == true)
            {
                // Cancel the asynchronous operation.
                backgroundWorker1.CancelAsync();
                button1.Enabled = true;
                button2.Enabled = false;
                label1.Text = "Cancel";
            }
        }
    }
}


推荐阅读