O. San
O. San

Reputation: 1177

C# .NET - Using Background Thread but GUI is Unresponsive

I'm implementing a Client who can ask a service for a certain action and also an abort button for this action. Once I run the action using background thread the abort button should become active, but instead the entire GUI is stuck with the mouse icon as hour glass (Should mention that the action is still indeed occurring).

    private void actionButton_Click(object sender, EventArgs e)
    {
        Run(RunMode.Action);
    }

    private void Run(RunMode runMode)
    {
        abortButton.Enabled = true;
        try
        {
            var name = "ds_file";
            var url = UrlProvider.BuildRequestUrl(runMode, name);

            StartLoading($"Running request: {url}");

            RunWorker(url);
        }
        catch (Exception ex)
        {
            AddToLog(ex.ToString());
            PopError("Failed to run, see error in log box");
        }

    }

    private void RunWorker(string url)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += (sender, args) =>
        {
            DatabaseHelper.DisableAllJobs();
            HttpRequestsHandler.HttpGet(url);
            DatabaseHelper.EnableRegularJobs();
        };
        worker.RunWorkerCompleted += (sender, args) =>
        {
            StopLoading();
            abortButton.Enabled = false;
            if (args.Error != null)
            {
                PopError("Failed to run, see error in log box");
                AddToLog(args.Error.ToString());
            }
            else
            {
                PopInfo("Completed successfully");
            }
        };
        worker.RunWorkerAsync();
    }

What am I doing wrong?

Thanks

Upvotes: 0

Views: 313

Answers (2)

O. San
O. San

Reputation: 1177

It indeed turns out I had controls.enable = false in some part of the code (I really thought it totally meant for something else), thank you all for your help!!

Upvotes: 0

Thiyagu Rajendran
Thiyagu Rajendran

Reputation: 663

Following example run background service every 10 seconds to update GUI. You can modify it as you wish. By running your thread as async task your GUI never get hang.

public frm_testform()
    {

        InitializeComponent();

        dispatcherTimer_Tick().DoNotAwait();

    }

private async Task dispatcherTimer_Tick()
    {
        DispatcherTimer timer = new DispatcherTimer();
        TaskCompletionSource<bool> tcs = null;
        EventHandler tickHandler = (s, e) => tcs.TrySetResult(true);

        timer.Interval = TimeSpan.FromSeconds(10);
        timer.Tick += tickHandler;
        timer.Start();

        while (true)
        {
            tcs = new TaskCompletionSource<bool>();

            await Task.Run(() =>
            {
           // Run your background service and UI update here
            await tcs.Task;
        }

    }

Upvotes: 2

Related Questions