- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的类(class)中实现了 IHttpAsyncHandler 以在后台执行 5-6 个长时间运行的进程,并在每个任务开始时向客户端确认。
早些时候我使用一个 session 变量并用任务的当前状态更新它,并以 5 秒的间隔从 jquery 向服务器发出异步调用请求以获取当前状态,但这种实现并不好,因为它不断地请求到状态服务器。
然后我在我的应用程序中实现了 IHttpAsyncHandler,现在服务器本身向客户端发送确认,但根据我的实现,我只能发送一个确认!如果我尝试发送多个,那么它会给出错误“对象引用未设置为对象的实例”
请检查我的示例代码。
在我的代码中ExecuteFirst() 方法可以很好地向客户端发送确认,但 ExecuteSecond() 不会发送确认它给出的错误。
我看了很多,但没有找到向客户端发送多个确认的正确方法。
这是我的示例代码,如果有人有任何想法,请帮助我。
Javascript
function postRequest(url) {
var url = 'StartLongRunningProcess.ashx?JOBCODE=18'
var xmlhttp = getRequestObject();
xmlhttp.open("POST", url, true);
xmlhttp.onreadystatechange =
function () {
if (xmlhttp.readyState == 4) {
var response = xmlhttp.responseText;
divResponse.innerHTML += "<p>" + response + "</p>";
}
}
xmlhttp.send();
}
function getRequestObject() {
var req;
if (window.XMLHttpRequest && !(window.ActiveXObject)) {
try {
req = new XMLHttpRequest();
}
catch (e) {
req = false;
}
}
else if (window.ActiveXObject) {
try {
req = new ActiveXObject('Msxml2.XMLHTTP');
}
catch (e) {
try {
req = new ActiveXObject('Microsoft.XMLHTTP');
}
catch (e) {
req = false;
}
}
}
return req;
}
StartLongRunningProcess.ashx.cs
public class StartLongRunningProcess: IHttpAsyncHandler, IRequiresSessionState
{
private AsyncRequestResult _asyncResult;
public void ProcessRequest(HttpContext context) {}
public bool IsReusable
{
get { return true;}
}
public IAsyncResult BeginProcessRequest(HttpContext context, System.AsyncCallback cb, object extraData)
{
int32 jobCode= convert.ToInt32(context.Request["JOBCODE"]);
_asyncResult = new AsyncRequestResult(context, cb, jobCode);
if(jobCode==18)
{
StartProcess18()
}
else
{
//StartProcessOther()
}
}
private StartProcess18()
{
var task1= new Task(() =>
{
ExecuteFirst();
});
var task2 = task1.ContinueWith((t1) =>
{
ExecuteSecond();
}, TaskContinuationOptions.OnlyOnRanToCompletion);
task1.Start();
}
private ExecuteFirst()
{
//notify to client that this job has been started
_asyncResult.CurrentContext.Response.Write("First task has been started");
_asyncResult.Notify();
// Above line of code successfully send a acknowledgement to client
//Doing some long running process
}
private ExecuteSecond()
{
//notify to client that this job has been started
_asyncResult.CurrentContext.Response.Write("Second task has been started");
// Above line of code giving error and if I skip it and call Notify() this also does not work.
_asyncResult.Notify();
//Doing some long running process
}
public void EndProcessRequest(IAsyncResult result)
{
}
}
AsyncRequestResult.cs
public class AsyncRequestResult : IAsyncResult
{
private HttpContext context;
private AsyncCallback callback;
private ManualResetEvent completeEvent = null;
private object data;
private object objLock = new object();
private bool isComplete = false;
public AsyncRequestResult(HttpContext ctx, AsyncCallback cb, object d)
{
this.context = ctx;
this.callback = cb;
this.data = d;
}
public HttpContext Context
{
get { return this.context; }
}
public void Notify()
{
//isComplete = true;
lock(objLock)
{
if(completeEvent != null)
{
completeEvent.Set();
}
}
if (callback != null)
{
callback(this);
}
}
public object AsyncState
{
get { return this.data; }
}
public bool CompletedSynchronously
{
get { return false; }
}
public WaitHandle AsyncWaitHandle
{
get
{
lock(objLock)
{
if (completeEvent == null)
completeEvent = new ManualResetEvent(false);
return completeEvent;
}
}
}
public bool IsCompleted
{
get { return this.isComplete; }
}
}
最佳答案
HttpContext.Current
仅当您在处理传入请求的线程中访问它时才不为 null。
您正在运行的延续任务很可能在 ThreadPool
线程上运行,而没有流向延续的 HttpContext.Current
,因此它为空。
尝试将您的 TaskScheduler 设置为 TaskScheduler.FromCurrentSynchronizationContext()
以便在相同的上下文中执行它。
private StartProcess18()
{
var task1= new Task(() =>
{
ExecuteFirst();
});
var task2 = task1.ContinueWith((t1) =>
{
ExecuteSecond();
}, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
task1.Start();
}
关于c# - 如何在 asp.net 中使用 IHttpAsyncHandler 向客户端发送多个确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23154734/
我正在尝试设置一个异步 HttpHandler,但我不知道我是否在正确的轨道上。似乎没有太多关于它的文档。我只想获取异步触发 DoWork() 方法的请求。 一些我不确定的事情: using Syst
我注意到 .NET IHttpAsyncHandler(和 IHttpHandler,在较小程度上)在受到并发 Web 请求时会泄漏内存。 在我的测试中,Visual Studio Web 服务器 (
我正在使用 IHttpHandler 调用 Web 服务并将生成的 byte[] 作为下载的文件附件返回给客户端。这工作正常,但是当我尝试将 IHttpHandler 更改为 IHttpAsyncHa
我尝试在 web.config 文件中设置executionTimeout: 查看 IIS 管理器请求页面,我可以看到请求在 30 秒后没有被终止。 我应该在 IHttpAsyncHandler
我尝试使用 IHttpAsyncHandler 在请求管道中注入(inject)解码过滤器,但我发现 Request.Filter 属性被忽略了。 有人成功地将 Request.Filter 与 IH
我已经通过 IHttpAsyncHandler 使用 .Net 异步编程模型在 C# 中实现了异步 http 请求处理。 我是 java 的新手,但想完成相同的目的——开始一个请求,让它交出请求处理线
在异步处理程序中,我从 webrequest 创建了一个 IObservable,它返回一个重定向字符串。 我正在订阅那个可观察对象并调用 AsyncResult.CompleteCall() 但我不
这是基本设置。我们有一个 ASP.Net WebForms 应用程序,其页面包含一个需要访问外部 Web 服务的 Flash 应用程序。由于(我推测的安全性)Flash 的限制(别问我,我根本不是 F
我制作了一个派生自 MvcHandler 的自定义处理程序。我的路由使用自定义 RouteHandler,它返回 GetHttpHandler() 的新处理程序,并且我在自定义处理程序中重写 Proc
我正在开发一个基于 Martin Fowler (link) 模式的 HTTP 前端 Controller 。就我而言, Controller 具有以下职责:- 解码封装数据- 授权请求- 记录- 将
我在我的类(class)中实现了 IHttpAsyncHandler 以在后台执行 5-6 个长时间运行的进程,并在每个任务开始时向客户端确认。 早些时候我使用一个 session 变量并用任务的当前
Java 世界中的 ASP.NET IHttpAsyncHandler 等价物是什么? 最佳答案 查看最新 Servlet 规范 (3.0) 中的异步支持:http://blogs.oracle.co
自从开始编写 ASP.NET 应用程序时,当我想添加线程时,我可以通过 3 种简单的方法在 ASP.NET 应用程序中完成线程: 使用System.Threading.ThreadPool。 使用自定
在此 question & answer ,我找到了一种让 ASP.NET MVC 支持异步处理的方法。但是,我无法让它发挥作用。 基本上,这个想法是创建一个新的 IRouteHandler 实现,它
我在使用实现 IHttpAsyncHandler 的通用处理程序时遇到了一些性能问题。最简单的是,处理程序接收 GET 请求,并在 20 秒后将“”写入响应后结束响应。 当使用 10000-20000
我是一名优秀的程序员,十分优秀!