- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在通过 ASP.net 自下而上地工作,并且我正在设置一个老式的委托(delegate)模式:
public delegate void ProcessRequestDelegate(HttpContext context);
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
ProcessRequestDelegate asyncDelegate = new ProcessRequestDelegate(ProcessRequest);
return asyncDelegate.BeginInvoke(context, cb, extraData);
}
public void EndProcessRequest(IAsyncResult result)
{
//?? profit?
}
但我意识到,我不知道在 EndProcessRequest
函数中将 IAsyncResult 结果
转换为什么。我试过:
public void EndProcessRequest(IAsyncResult result)
{
// Compiler error because this is dumb
((ProcessRequestDelegate)result).EndInvoke(result);
}
但显然您不能将结果转换给委托(delegate)人。那么结束调用的正确方法是什么。更一般地说,Delegate.BeginInvoke
返回什么样的类?
更新
所以我试了一下:
public static void Main()
{
IAsyncResult result = BeginStuff("something", null, null);
IAsyncResult result2 = BeginStuff("something else", null, null);
EndStuff(result);
EndStuff(result2);
Console.ReadLine();
}
static Action<String> act = delegate(String str)
{
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("This seems to work");
Thread.Sleep(TimeSpan.FromSeconds(2));
};
static Action<String> act2 = delegate(String str) { };
public static IAsyncResult BeginStuff(String data, AsyncCallback callback, Object state)
{
return Program.act.BeginInvoke(data, callback, state);
}
public static void EndStuff(IAsyncResult result)
{
// This works fine no matter how many times BeginInvoke is called
Program.act.EndInvoke(result);
// This however will fail, because the delegate that began the invocation
// is not the same as the one that ends it.
Program.act2.EndInvoke(result);
}
它似乎工作正常。只要使用相同的委托(delegate)调用 BeginInvoke
/EndInvoke
,运行时就会处理其余部分(我想这就是 IAsyncResult 的用途)。但是,如果您尝试结束使用不同的委托(delegate),它会善意提醒您不要那样做。
另一个更新
我找到了一个更好的方法:
public void Operation()
{
throw new FaultException<FrieldyError>(new FrieldyError("returned with this error"));
}
public IAsyncResult BeginOperation(AsyncCallback callback, object state)
{
return ((Action)Operation).BeginInvoke(callback, state);
}
public void EndOperation(IAsyncResult result)
{
((Action)Operation).EndInvoke(result);
}
由于您只需要使用相同类型的委托(delegate),您可以使用其中一个预先存在的委托(delegate)并且它工作正常。无需声明您自己的本地/私有(private)代表。
有用!
最佳答案
Delegate.BeginInvoke
返回的具体类是什么对您来说无关紧要,无论它是什么,接口(interface)都会提供您等待其完成所需的一切(使用 WaitHandle
或轮询技术 [ examples ]) 并调用EndInvoke
。
此外,您还指定了一个 AsyncCallback
参数,难道您不只是将 EndProcessRequest
传递给它吗?
例如,
this.BeginProcessRequest(
HttpContext.Current,
this.EndProcessRequest,
"My extra data");
评论后编辑:
如果您按照您的评论描述的那样实现 IHttpAsyncHandler
,您应该会遇到更少的问题,因为您可以将委托(delegate)实例存储为您的类的成员
public class ProcessRequestAsyncHandler ; IHttpAsyncHandler
{
private ProcessRequestDelegate asyncDelegate;
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
asyncDelegate = new ProcessRequestDelegate(ProcessRequest);
return asyncDelegate.BeginInvoke(context, cb, extraData);
}
public void EndProcessRequest(IAsyncResult result)
{
asyncDelegate.EndInvoke(result);
}
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
// Do something long-running
}
}
引用:
关于c# - BeginInvoke 返回什么样的类?我如何使用它来调用 EndInvoke?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15360942/
在网页上,我调用不允许我以编程方式设置超时的第三方。我调用 BeginInvoke 并使用 AsyncWaitHandle.WaitOne 等待指定的时间量。 如果调用超时,我会继续并忘记我开始的线程
一个异步问题: 我在互联网上阅读了大量支持和反对 Delegate.EndInvoke() 可选的文章。这些文章大多数都是 4-5 年前的文章。很多死链接。 任何人都可以解释一下,在 .NET 2.0
我有一个正常的方法 public List FindNearByCity(string targetCity) { // ... some implementation } 我想为这个方法添加异步支持
我不会做很多 Windows GUI 编程,所以对于比我更熟悉 WinForms 的人来说,这可能都是常识。不幸的是,我今天在调试期间遇到了任何资源来解释这个问题。 如果我们在异步委托(delegat
我读过几个论坛,甚至一两个stackoverflow问题都说在使用Delegate.BeginInvoke时Delegate.EndInvoke是必要的。我读过的许多谈论使用 BeginInvoke
所以 C#/.NET 问题。在使用 .BeginInvoke 异步调用某些方法时,是否总是需要调用 .EndInvoke?我在某处读到它是强制性的,但问题是 .EndInvoke 会阻止执行吗?有某种
我有一个显示实时值的客户端应用程序。这些值通过 DDE-Advise 提供。这些实时值是数控机床的移动轴。因此,通过此 DdeClientAdvise-Method,每分钟大约有 100 个建议。 当
在 BeginInvoke 之后的回调中,AsyncResult.AsyncDelegate 需要转换为正确的类型,然后才能访问 EndInvoke。 但是我正在使用泛型,那么我是否需要为 N 个泛化
以这种方式为 MainForm 线程调用委托(delegate)是一种好习惯吗?: Txt.MainForm.EndInvoke( Txt.MainForm.BeginInvoke( new
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicates: Must every BeginInvoke be followed by an EndInvoke? I
关于是否每个 BeginInvoke() 都必须与 EndInvoke() 匹配,我读过相互矛盾的意见。是否存在与不调用 EndInvoke() 相关的任何泄漏或其他问题? 最佳答案 Delegate
我有以下测试 [Test] public void aaa() { CallContext.LogicalSetData("aa", "1"); Action parallelMeth
我正在通过 ASP.net 自下而上地工作,并且我正在设置一个老式的委托(delegate)模式: public delegate void ProcessRequestDelegate(Ht
我正在通过 ASP.net 自下而上地工作,并且我正在设置一个老式的委托(delegate)模式: public delegate void ProcessRequestDelegate(Ht
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Why does asynchronous delegate method require calling
试图围绕 Tasks 类,更具体地说,Task.Factory.FromAsync 方法。 目前在我的代码中我正在做这样的事情: var handler = MyEvent; if (handler
我的 .aspx 文件中的这个方法... private static string GetPageAsString(string address) {
以下类为例。 public class A { // ... void Foo(S myStruct){...} } public class B { public A test;
为什么委托(delegate)需要在方法触发之前调用 EndInvoke?如果我需要调用 EndInvoke(它会阻塞线程)那么它不是真正的异步调用吗? 这是我要运行的代码。 class Progra
我想知道 BeginInvoke/EndInvoke 方法是如何在委托(delegate)上实现的。我知道它们是由编译器自动生成的,有点特殊,所以反汇编程序无法处理它们。但最终是代码被执行了,对吧?出
我是一名优秀的程序员,十分优秀!