C# NET-使用后台线程,但GUI没有响应

C# NET-使用后台线程,但GUI没有响应,c#,.net,C#,.net,我正在实现一个客户机,它可以请求服务执行某个操作,还可以为该操作执行一个中止按钮。 一旦我使用后台线程运行该操作,abort按钮应该会变为活动状态,但是整个GUI都会被鼠标图标作为计时器卡住(应该提到,该操作仍然在发生) 我做错了什么 感谢以下示例每10秒运行一次后台服务以更新GUI。您可以根据需要修改它。通过将线程作为异步任务运行,GUI永远不会挂起 public frm_testform() { InitializeComponent(); dis

我正在实现一个客户机,它可以请求服务执行某个操作,还可以为该操作执行一个中止按钮。 一旦我使用后台线程运行该操作,abort按钮应该会变为活动状态,但是整个GUI都会被鼠标图标作为计时器卡住(应该提到,该操作仍然在发生)

我做错了什么


感谢以下示例每10秒运行一次后台服务以更新GUI。您可以根据需要修改它。通过将线程作为异步任务运行,GUI永远不会挂起

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;
        }

    }
public frm_testform()
{
初始化组件();
Dispatchermer_Tick().DoNotAwait();
}
专用异步任务分派器_Tick()
{
调度程序计时器=新调度程序();
TaskCompletionSource tcs=null;
EventHandler=(s,e)=>tcs.TrySetResult(true);
timer.Interval=从秒开始的时间跨度(10);
timer.Tick+=tickHandler;
timer.Start();
while(true)
{
tcs=新任务完成源();
等待任务。运行(()=>
{
//在此处运行后台服务和UI更新
等待tcs任务;
}
}

以下示例每10秒运行一次后台服务以更新GUI。您可以根据需要修改它。通过将线程作为异步任务运行,您的GUI永远不会挂起

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;
        }

    }
public frm_testform()
{
初始化组件();
Dispatchermer_Tick().DoNotAwait();
}
专用异步任务分派器_Tick()
{
调度程序计时器=新调度程序();
TaskCompletionSource tcs=null;
EventHandler=(s,e)=>tcs.TrySetResult(true);
timer.Interval=从秒开始的时间跨度(10);
timer.Tick+=tickHandler;
timer.Start();
while(true)
{
tcs=新任务完成源();
等待任务。运行(()=>
{
//在此处运行后台服务和UI更新
等待tcs任务;
}
}

事实证明我在代码的某些部分有控件。enable=false(我真的认为它完全是为了其他东西),谢谢大家的帮助!!

事实证明我在代码的某些部分有控件。enable=false(我真的认为它完全是为了其他东西),谢谢大家的帮助!!

阅读此问题:猜测一下,您没有向我们展示的一些代码中有一个
调用
,它将所有内容强制返回到UI线程上。从显示的代码中无法分辨,但这是此类场景中的常见错误。您能否向我们展示您的帮助器类,它们的方法在DoWork中被调用应对措施?也许尝试将后台工作程序更改为异步/等待加载是一种耗时的方法,需要很长时间才能完成?您可以进入按钮单击代码执行,看看它会出现什么问题。阅读下面的问题:猜测一下,您没有向我们展示的一些代码有一个
调用
,它会将所有内容强制返回UI线程。不可能从显示的代码中可以看出这一点,但这是此类场景中的常见错误。您能否向我们展示您的助手类,其方法在DoWork作用域中被调用?可能尝试将后台工作程序更改为async/Waiting。加载是一种耗时的方法,需要很长时间才能完成?您可以进入按钮单击代码执行,以查看我把它弄坏了。