C# NET-使用后台线程,但GUI没有响应
我正在实现一个客户机,它可以请求服务执行某个操作,还可以为该操作执行一个中止按钮。 一旦我使用后台线程运行该操作,abort按钮应该会变为活动状态,但是整个GUI都会被鼠标图标作为计时器卡住(应该提到,该操作仍然在发生) 我做错了什么C# NET-使用后台线程,但GUI没有响应,c#,.net,C#,.net,我正在实现一个客户机,它可以请求服务执行某个操作,还可以为该操作执行一个中止按钮。 一旦我使用后台线程运行该操作,abort按钮应该会变为活动状态,但是整个GUI都会被鼠标图标作为计时器卡住(应该提到,该操作仍然在发生) 我做错了什么 感谢以下示例每10秒运行一次后台服务以更新GUI。您可以根据需要修改它。通过将线程作为异步任务运行,GUI永远不会挂起 public frm_testform() { InitializeComponent(); dis
感谢以下示例每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。加载是一种耗时的方法,需要很长时间才能完成?您可以进入按钮单击代码执行,以查看我把它弄坏了。