事件触发后,c#程序不会响应

事件触发后,c#程序不会响应,c#,mono,C#,Mono,我正在为一个程序开发一个用户界面,发生了一些非常奇怪的事情 我有一个文本视图,两个按钮和一个进度条。我将控制台上的输出重定向到文本视图。因此,我点击按钮,我应该收到输出消息。开始时还可以,但后来我使用了一些较长的例程,我尝试登录到web服务并使用web请求 我的代码几乎可以正常工作,我可以登录并使我的web请求正常工作。但是因为答案可能会变慢,我创建了一些输出消息,然后我的问题就开始了。。在我在事件处理程序端创建的所有代码运行之前,我的接口不会更新。当代码结束执行时,我一次收到所有的输出消息。程

我正在为一个程序开发一个用户界面,发生了一些非常奇怪的事情

我有一个文本视图,两个按钮和一个进度条。我将控制台上的输出重定向到文本视图。因此,我点击按钮,我应该收到输出消息。开始时还可以,但后来我使用了一些较长的例程,我尝试登录到web服务并使用web请求

我的代码几乎可以正常工作,我可以登录并使我的web请求正常工作。但是因为答案可能会变慢,我创建了一些输出消息,然后我的问题就开始了。。在我在事件处理程序端创建的所有代码运行之前,我的接口不会更新。当代码结束执行时,我一次收到所有的输出消息。程序运行时,我甚至不能移动窗口

我第一次在c上编程,我不得不使用它,因为我需要使用dll。。这种问题以前从未发生过。我通常使用Java。 好像代码没有按正确的顺序运行,对我来说没有意义。。因为我知道我的代码是正确的,因为它在控制台上运行,并且在程序没有响应时运行

我似乎无法理解这一点,我应该使用线程来处理事件吗

class MainClass
{
    public static void Main (string[] args)
    {


        Application.Init ();
        UIMain win = new UIMain ();

        win.ShowAll ();
        Application.Run ();
    }
}



public partial class UIMain : Gtk.Window
{

    public UIMain () : 
        base (Gtk.WindowType.Toplevel)
    {
        System.Windows.Forms.Application.EnableVisualStyles ();
        this.Build ();


        Console.SetOut (new ControlWritter(this.textview1));


    }

    protected void OnButton2Clicked (object sender, EventArgs e)
    {
        if (entry1.Text.Equals(String.Empty) || entry2.Text.Equals(String.Empty)) {
            Console.WriteLine("random output");
        }

        ConstantesSetup.autoSetup ();

        button1.Sensitive = true;

        if (!ConstantesSetup.var1) {
            ConstantesSetup.routine6 ();
            ConstantesSetup.routine5 ();
            ConstantesSetup.routine4 ();
            ConstantesSetup.routine3 ();
            ConstantesSetup.routine2 ();

            ConstantesSetup.var1 = true;
        }
    }

    protected void OnButton1Clicked (object sender, EventArgs e)
    {
        switch (ConstantesSetup.erp) {
        case "ERP":
            eti_scp.autoSync (this);
            break;
        }
    }
}
我很抱歉没有代码,但我甚至不知道我们是否要开始寻找问题


谢谢你抽出时间;)

您正在使用长时间运行的同步操作阻塞UI线程。您需要异步运行这些长时间运行的操作,以便在后台运行任务时,按钮单击事件处理程序可以立即返回

异步运行任务有几个选项,但一个简单的选项是使用
BackgroundWorker
。在事件处理程序中,您可以执行以下操作:

var worker = new BackgroundWorker();

worker.DoWork += (o, args) =>
{
    //call long running processes here
};

worker.RunWorkerAsync();

BackgroundWorker还将为您将这些操作分派到UI线程上,以便您可以更新
DoWork
回调方法中表单中的控件。

谢谢您解决了这个问题,我没有使用这个示例,但它给了我提示