- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
以下类为例。
public class A
{
// ...
void Foo(S myStruct){...}
}
public class B
{
public A test;
// ...
void Bar()
{
S myStruct = new S();
test.Foo(myStruct);
}
}
现在,我希望方法调用 test.Foo(myStruct) 成为异步调用(“即发即弃”)。 bar-method 需要尽快返回。有关委托(delegate)、BeginInvoke、EndInvoke、ThreadPool 等的文档无法帮助我找到解决方案。
这是一个有效的解决方案吗?
// Is using the `EndInvoke` method as the callback delegate valid?
foo.BeginInvoke(myStruct, foo.EndInvoke, null);
最佳答案
您不需要调用EndInvoke
;不调用它仅仅意味着:
听起来你想要“即发即弃”,所以最简单的方法是使用匿名委托(delegate),例如:
var del = new Action(foo.Bar);
del.BeginInvoke(iar =>
{
try
{
del.EndInvoke(iar);
}
catch (Exception ex)
{
// Log the message?
}
}, null);
这是执行这段代码时发生的情况:
del
和匿名委托(delegate) (iar => ...
)。del
。EndInvoke
时,方法的结果要么返回,要么抛出异常(如果发生异常)。请注意,上面的示例与以下示例有很大不同:
// This is pointless and is still, essentially, synchronous.
del.EndInvoke(del.BeginInvoke(null, null));
编辑:您应该始终调用End*
。我从来没有发现不调用它会出现问题的情况,但这是一个实现细节并且是 relying on undocumented behavior.
最后,如果抛出异常,您的解决方案会使进程崩溃,
如果您不关心异常,您可以简单地将 null 作为委托(delegate)传递 (
所以作为最后一个例子,你正在寻找的可能是:del.BeginInvoke(myStruct, null, null) ;
).
public class A
{
// ...
void Foo(S myStruct){...}
void FooAsync(S myStruct)
{
var del = new Action<S>(Foo);
del.BeginInvoke(myStruct, SuppressException, del);
}
static void SuppressException(IAsyncResult ar)
{
try
{
((Action<S>)ar.AsyncState).EndInvoke(ar);
}
catch
{
// TODO: Log
}
}
}
关于没有 EndInvoke 的 C# 异步调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7492741/
在网页上,我调用不允许我以编程方式设置超时的第三方。我调用 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)上实现的。我知道它们是由编译器自动生成的,有点特殊,所以反汇编程序无法处理它们。但最终是代码被执行了,对吧?出
我是一名优秀的程序员,十分优秀!