从 Task.Factory 更新 GUI
Update GUI From Task.Factory
我正在使用 ASP.Net,我想要实现的是我有一个我调用的服务,在调用该服务之前我操作一些 UI 控件,在服务完成之后我操作UI 再次控制。
问题是 UI 控件值在 Task.Factory 的正文中永远不会更改(在服务调用完成后)并且没有触发任何异常。
这是我的代码:
try
{
Task ocrTask = Task.Factory.StartNew(() =>
{
OCRResult result = new OCRServiceHandler().Start(image);
if (string.IsNullOrEmpty(result.Error))
{
ViewState["OCRResult"] = result;
lbl_Status.Text = string.Empty;
div_Result.Visible = true;
}
else
{
ViewState["OCRResult"] = null;
lbl_Status.Text = result.Error;
div_Result.Visible = false;
}
//Clear upload file
myFile.Attributes.Clear();
//Hide processing image
img_Processing.Visible = false;
}, CancellationTask.None, TaskCreationOptions.None, uiScheduler);
}
catch (Exception ex)
{
throw ex;
}
我试过使用 ContinueWith 并在那里更新 UI 控件,但结果相同,我也试过使用 ThreadStart,但结果相同,我也试过更改 TaskScheduler 类型,同样发生了。
您会希望您的长 运行 工作和 UI 更新在单独的任务中进行。原因是长 运行 g 任务不应该在 UI 线程上,但更新必须在本质上。所以使用 continuewith 是一种非常常见的模式。
当您使用 continuewith 时,请确保将 ui 上下文作为您的调度程序传递。因此,从 UI 线程(重要!)Do task.ContinueWith 传入 taskscheduler.fromcurrentsynchronizationcontext 作为可选的任务调度程序参数。
编辑:刚刚意识到您正在使用 asp.net。我假设您使用的是网络表单的措辞。基本上忽略整个UI 线程内容。它不适用于你。事实上,如果这是在页面加载时,那么使用任务的价值就很小。
无论哪种方式,您都需要暂停页面的其余处理才能正常工作。
您目前看到的可能是让页面呈现,然后尝试修改内容。来不及了。
您将需要在客户端级别异步实现您想要的,然后 return JSON/JavaScript。无法使 Web 表单页面异步执行正常加载,它必须呈现或不呈现。
我正在使用 ASP.Net,我想要实现的是我有一个我调用的服务,在调用该服务之前我操作一些 UI 控件,在服务完成之后我操作UI 再次控制。
问题是 UI 控件值在 Task.Factory 的正文中永远不会更改(在服务调用完成后)并且没有触发任何异常。
这是我的代码:
try
{
Task ocrTask = Task.Factory.StartNew(() =>
{
OCRResult result = new OCRServiceHandler().Start(image);
if (string.IsNullOrEmpty(result.Error))
{
ViewState["OCRResult"] = result;
lbl_Status.Text = string.Empty;
div_Result.Visible = true;
}
else
{
ViewState["OCRResult"] = null;
lbl_Status.Text = result.Error;
div_Result.Visible = false;
}
//Clear upload file
myFile.Attributes.Clear();
//Hide processing image
img_Processing.Visible = false;
}, CancellationTask.None, TaskCreationOptions.None, uiScheduler);
}
catch (Exception ex)
{
throw ex;
}
我试过使用 ContinueWith 并在那里更新 UI 控件,但结果相同,我也试过使用 ThreadStart,但结果相同,我也试过更改 TaskScheduler 类型,同样发生了。
您会希望您的长 运行 工作和 UI 更新在单独的任务中进行。原因是长 运行 g 任务不应该在 UI 线程上,但更新必须在本质上。所以使用 continuewith 是一种非常常见的模式。
当您使用 continuewith 时,请确保将 ui 上下文作为您的调度程序传递。因此,从 UI 线程(重要!)Do task.ContinueWith 传入 taskscheduler.fromcurrentsynchronizationcontext 作为可选的任务调度程序参数。
编辑:刚刚意识到您正在使用 asp.net。我假设您使用的是网络表单的措辞。基本上忽略整个UI 线程内容。它不适用于你。事实上,如果这是在页面加载时,那么使用任务的价值就很小。
无论哪种方式,您都需要暂停页面的其余处理才能正常工作。
您目前看到的可能是让页面呈现,然后尝试修改内容。来不及了。
您将需要在客户端级别异步实现您想要的,然后 return JSON/JavaScript。无法使 Web 表单页面异步执行正常加载,它必须呈现或不呈现。