C# BackgroundWorker:在progressChanged事件后将信息从UI线程传递到后台工作线程
我正在准备一个WPF应用程序,它在单击按钮时启动HTTP服务器, HTTP服务器是后台工作程序: 代码: 启动HTTP服务器的DoWork事件: HTTP服务器代码:当服务器上的端点被命中时,将触发报告进度事件 进度更改事件:此事件获取从HTTP服务器传递的信息,设置HTTP响应的状态 我想返回在WebAPI\u ProgressChanged事件委托中设置的状态['response\u for\u HTTP'], 要返回到HTTP服务器[“触发事件的位置”]C# BackgroundWorker:在progressChanged事件后将信息从UI线程传递到后台工作线程,c#,wpf,multithreading,asp.net-core-mvc,backgroundworker,C#,Wpf,Multithreading,Asp.net Core Mvc,Backgroundworker,我正在准备一个WPF应用程序,它在单击按钮时启动HTTP服务器, HTTP服务器是后台工作程序: 代码: 启动HTTP服务器的DoWork事件: HTTP服务器代码:当服务器上的端点被命中时,将触发报告进度事件 进度更改事件:此事件获取从HTTP服务器传递的信息,设置HTTP响应的状态 我想返回在WebAPI\u ProgressChanged事件委托中设置的状态['response\u for\u HTTP'], 要返回到HTTP服务器[“触发事件的位置”] 即使将HTTP的响应设置为500,
即使将HTTP的响应设置为500,我也会将响应状态设置为0。如果需要返回值,则应在
DoWork
事件中执行ProgressChanged
用于向UI提供进度状态,而不是获取任何类型的反馈。您试图做什么,从UI手动设置状态代码?在这种情况下,您需要使用WPF的dispatcher,而不是backgroundworkerI更新发送者对象类,添加字段响应并在Progress Changed中设置它。但是在HTTP服务器[action method]内部,HTTP响应返回为0而不是500。更新后的代码ReportProgress
是异步的,因此使用TaskCompletionSource
作为状态代码。但正如我之前所说的,你在工作中使用了错误的工具。改为使用dispatcher,或者使用正确同步上下文的任务senderObject是否为值类型?如果它是引用类型,则后台线程很可能在返回响应之前完成。后台工作人员无法控制进度事件的工作流程
private void WebAPI_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
string arg = (string)e.Argument;
WebAPI.Http_Server.InitHttpServer(bw,e);
}
[HttpGet]
[Route("/XYZ")]
public virtual IActionResult GetXYZ()
{
//do something
SenderObject so = new SenderObject();
so.Path = req.Path.Value;
so.Query = req.QueryString.Value;
so.ContentType = req.ContentType;
Http_Server.bw.ReportProgress(1, so);
// want value of variable "response_for_HTTP" here
return StatusCode(so.response_for_HTTP);
// return "response_for_HTTP" as status code
}
private void WebAPI_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
WebAPI.SenderObject so = (WebAPI.SenderObject)e.UserState;
Request = so.Path;
//get value for response_for_HTTP
so.response_for_HTTP = 500;
//want response_for_HTTP returned to HTTP requester
}