gpt4 book ai didi

c# - BeginInvoke 返回什么样的类?我如何使用它来调用 EndInvoke?

转载 作者:行者123 更新时间:2023-12-02 05:11:36 28 4
gpt4 key购买 nike

我正在通过 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com