Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BackgroundWorker:在progressChanged事件后将信息从UI线程传递到后台工作线程_C#_Wpf_Multithreading_Asp.net Core Mvc_Backgroundworker - Fatal编程技术网

C# BackgroundWorker:在progressChanged事件后将信息从UI线程传递到后台工作线程

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,

我正在准备一个WPF应用程序,它在单击按钮时启动HTTP服务器, HTTP服务器是后台工作程序:

代码:

启动HTTP服务器的DoWork事件:

HTTP服务器代码:当服务器上的端点被命中时,将触发报告进度事件

进度更改事件:此事件获取从HTTP服务器传递的信息,设置HTTP响应的状态

我想返回在WebAPI\u ProgressChanged事件委托中设置的状态['response\u for\u HTTP'], 要返回到HTTP服务器[“触发事件的位置”]


即使将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

    }