运行长循环时,表单不显示在C#中?

运行长循环时,表单不显示在C#中?,c#,C#,当我点击一个按钮时,我的表单不会显示,但程序会继续运行,正如我从C#(WindowsFormApp)中的调试中看到的那样 按钮的代码为: private void button1_Click(object sender, EventArgs e) { string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); string files = string.Joi

当我点击一个按钮时,我的表单不会显示,但程序会继续运行,正如我从C#(WindowsFormApp)中的调试中看到的那样

按钮的代码为:

private void button1_Click(object sender, EventArgs e)
    {
        string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        string files = string.Join(",", Directory.GetFiles(desktop, "*", SearchOption.AllDirectories).ToList().ToArray());
        textBox1.Text = files;
        string dir = string.Join(",", Directory.GetDirectories(desktop, "*", SearchOption.AllDirectories).ToList().ToArray());
        textBox2.Text = dir;
        int count;
        for (count = 0; count <= dir.Split(',').Length - 1; count++)
        {
            Console.WriteLine(dir.Split(',')[count].Replace(desktop, "").Replace('\\', '/'));
            mkdir(dir.Split(',')[count].Replace(desktop, "").Replace('\\', '/'));
        }
        for (count = 0; count <= files.Split(',').Length - 1; count++)
        {
            Console.WriteLine(files.Split(',')[count].Replace(desktop, "").Replace('\\', '/'));
            upload(files.Split(',')[count], files.Split(',')[count].Replace(desktop, "").Replace('\\', '/'));
        }
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
字符串desktop=Environment.GetFolderPath(Environment.SpecialFolder.desktop);
string files=string.Join(“,”,Directory.GetFiles(desktop,“*”,SearchOption.AllDirectories).ToList().ToArray());
textBox1.Text=文件;
string dir=string.Join(“,”,Directory.GetDirectories(desktop,“*”,SearchOption.AllDirectories).ToList().ToArray());
textBox2.Text=dir;
整数计数;

对于(count=0;count这可能是因为您在主线程中运行,您可以将代码放在另一个线程中运行并释放主线程ng在同样运行UI的同一线程上运行操作

关于如何在WinForms中异步运行的示例,请参见下面的问题

同步与异步

同步操作一次只能按顺序运行一个。这意味着,当您的代码忙于将文件上载到FTP时,它无法处理您执行的任何UI操作。上载完成后,可以自由地再次响应


异步操作彼此并行运行,因此您的UI不会被上载操作阻塞

问题在于,您正在运行UI的同一线程上执行长时间运行的操作

关于如何在WinForms中异步运行的示例,请参见下面的问题

同步与异步

同步操作一次只能按顺序运行一个。这意味着,当您的代码忙于将文件上载到FTP时,它无法处理您执行的任何UI操作。上载完成后,可以自由地再次响应


异步操作彼此并行运行,因此您的UI不会被上载操作阻塞。您的应用程序是单线程应用程序。若要使其成为多线程,请使用并行任务库或后台工作线程。

您的应用程序是单线程应用程序。若要使其成为多线程应用程序,请使用并行任务库或后台工作线程询问库或后台工作线程。

首先。您需要使您的程序更加模块化,并将UI任务与程序任务分开。在您的情况下,您将拥有一个类,它可以完成button1_Click()所做的一切。此外,button1_Click不是描述性的,应该是

在类中,您可以将方法定义为任务,在表单类中,您可以使用wait关键字调用类中的方法

例如,在Form.cs中

    private async void AsyncCall_Click(object sender, EventArgs e)
    {
        //ac is an object that is initialized in Form constructor.
        await ac.ChangeHello1();
    }
在AsyncClass.cs中

class AsyncClass
{
    public string Hello = "ASYNC NOT DONE";
    public AsyncClass()
    {

    }

    private async Task<string> ChangeHello()
    {
        await Task.Yield();
        await Task.Delay(2000);
        return "ASYNC DONE";
    }

    public async Task ChangeHello1()
    {
        Hello = await ChangeHello();
    }
}
class异步类
{
公共字符串Hello=“异步未完成”;
公共异步类()
{
}
私有异步任务ChangeHello()
{
等待任务;
等待任务。延迟(2000);
返回“异步完成”;
}
公共异步任务ChangeHello1()
{
Hello=等待更改Hello();
}
}

现在,在UI进行计算时,您仍然可以单击UI中的其他元素。

首先,您需要使您的程序更加模块化,并将UI任务与程序任务分开。在您的情况下,您将拥有一个类,该类完成button1\u click()所做的一切。此外,button1\u click不是描述性的,应该是

在类中,您可以将方法定义为任务,在表单类中,您可以使用wait关键字调用类中的方法

例如,在Form.cs中

    private async void AsyncCall_Click(object sender, EventArgs e)
    {
        //ac is an object that is initialized in Form constructor.
        await ac.ChangeHello1();
    }
在AsyncClass.cs中

class AsyncClass
{
    public string Hello = "ASYNC NOT DONE";
    public AsyncClass()
    {

    }

    private async Task<string> ChangeHello()
    {
        await Task.Yield();
        await Task.Delay(2000);
        return "ASYNC DONE";
    }

    public async Task ChangeHello1()
    {
        Hello = await ChangeHello();
    }
}
class异步类
{
公共字符串Hello=“异步未完成”;
公共异步类()
{
}
私有异步任务ChangeHello()
{
等待任务;
等待任务。延迟(2000);
返回“异步完成”;
}
公共异步任务ChangeHello1()
{
Hello=等待更改Hello();
}
}
现在,在UI进行计算时,您仍然可以单击UI中的其他元素。

这起到了作用:

await Task.Run(() => fuction())
这起到了作用:

await Task.Run(() => fuction())

搜索关于多线程的内容。您应该了解后台工作者/线程,因为在主线程上执行如此繁重的操作代价高昂,对您作为开发人员的声誉不利。请重新搜索关于多线程的答案。您应该了解后台工作者/线程,因为在主线程上执行如此繁重的操作主线程上的s是昂贵的操作,不利于您作为开发人员的声誉。请回答这个问题