在网页上,我正在呼叫第三方,它不允许我以编程方式设置超时.我调用BeginInvoke并使用AsyncWaitHandle.WaitOne等待指定的时间.
如果呼叫超时,我继续前进,忘记我开始的线程呼叫.我的问题是,在超时情况下,我是否还要以某种方式调用EndInvoke?这个MSDN页面上的"注意"注释让我想知道我是否应该:http://msdn.microsoft.com/en-us/library/2e08f6yc(VS.71).aspx
如果您认为我应该,那么接下来的问题是,如果我的网页已经完成处理并在第三方回来之前返回到客户端,那么回调方法是否会在那里听取运行代码?一旦我的请求/响应完成,服务器是否停止寻找活动?
这是我正在使用的代码:
public class RemotePaymentProcessor
{
private delegate string SendProcessPaymentDelegate(string creditCardNumber);
private string SendProcessPayment(string creditCardNumber)
{
string response = string.Empty;
// call web service
SlowResponseService.SlowResponseService srs = new WebServiceTimeout.SlowResponseService.SlowResponseService();
response = srs.GetSlowResponse(creditCardNumber);
return response;
}
public string ProcessPayment(string creditCardNumber, int timeoutMilliseconds)
{
string response = string.Empty;
SendProcessPaymentDelegate sppd = new SendProcessPaymentDelegate(SendProcessPayment);
IAsyncResult ar = sppd.BeginInvoke(creditCardNumber, null, new object());
if (!ar.AsyncWaitHandle.WaitOne(timeoutMilliseconds, false))
{
// Async call did not return before timeout
response = "TIMEOUT";
}
else …Run Code Online (Sandbox Code Playgroud) 根据Jon Skeet的说法,"您只能在具有单个目标调用的委托上调用BeginInvoke."
这是为什么?真正的原因是什么?
注意:为了澄清(因为我犯了这个错误),我说的BeginInvoke是代表,而不是控件.
为了避免冻结GUI,我想运行异步连接到DB的方法.所以我写了这个:
DelegatLoginu dl = ConnectDB;
IAsyncResult ar = dl.BeginInvoke(null, null);
var result = (bool)dl.EndInvoke(ar);
Run Code Online (Sandbox Code Playgroud)
但它仍然冻结,我不明白为什么.我认为BeginInvoke确保调用的代码在另一个线程中运行.谢谢!
我正在寻找一种在Action方法上测试BeginInvoke的方法,因为该方法在后台线程上运行,无法知道它何时实际完成或调用回调方法.我正在寻找一种方法来保持我的测试等待,直到在进行断言之前调用回调.
在下面的Presenter类中,您可以注意到我在后台线程上调用PopulateView,它在获取数据时更新视图,并且我正在尝试断言视图属性已正确初始化.
我正在使用NUnit和Moq.
public class Presenter
{
private IView _view;
private IService _service;
public Presenter(IView view, IService service)
{
_view = view;
_service = service;
Action action = PopulateView;
action.BeginInvoke(PopulateViewCallback, action);
}
private void PopulateViewCallback(IAsyncResult ar)
{
try
{
Action target = (Action)ar.AsyncState;
target.EndInvoke(ar);
}
catch (Exception ex)
{
Logger.Instance.LogException("Failed to initialize view", ex);
}
}
private void PopulateView()
{
Thread.Sleep(2000); // Fetch data _service.DoSomeThing()
_view.Property1 = "xyz";
}
}
Run Code Online (Sandbox Code Playgroud) 谁能告诉我为什么这段代码的行为方式呢?查看代码中嵌入的评论......
我错过了一些非常明显的东西吗?
using System;
namespace ConsoleApplication3
{
public class Program
{
static void Main(string[] args)
{
var c = new MyChild();
c.X();
Console.ReadLine();
}
}
public class MyParent
{
public virtual void X()
{
Console.WriteLine("Executing MyParent");
}
}
delegate void MyDelegate();
public class MyChild : MyParent
{
public override void X()
{
Console.WriteLine("Executing MyChild");
MyDelegate md = base.X;
// The following two calls look like they should behave the same,
// but they behave differently!
// Why does Invoke() call …Run Code Online (Sandbox Code Playgroud) 有时,当调用Delegate.BeginInvoke时,执行委托方法需要一秒以上的时间.
延迟的原因是什么?我在一个连续运行的应用程序中每天发出1到2次这个问题.
请帮我.
谢谢!
我正在使用单声道测试我的应用程序预装Linux端口,我有一个线程问题.我最初考虑在这里粘贴3000个代码行,但最后我设计了一个小的最小例子;)
你有一个带有按钮的表单(诗意地命名Button1,并且有一个标签(毫无意外地带有名称Label1)).整个地段都在一个叫做的形式上过着幸福的生活Form1.单击Button1启动无限循环,增加本地计数器并更新Label1(使用Invoke)以反映其值.
现在在Mono中,如果您调整表单大小,标签将停止更新,永远不会重新启动.MS实现不会发生这种情况.BeginInvoke没有更好的工作; 更糟糕的是,它使UI在两种情况下都挂起.
你知道这种差异来自哪里吗?你会如何解决它?最后,为什么BeginInvoke不在这里工作?我一定是犯了一个大错...但是哪个?
Invoke调用永远不会返回.我想知道为什么.BeginInvoke,在调整大小操作结束之前也不会执行异步调用.在MS.Net上,它们在调整大小时继续运行.代码看起来像这样(C#版本更低):
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim T As New Threading.Thread(AddressOf Increment)
T.Start()
End Sub
Sub UpdateLabel(ByVal Text As String)
Label1.Text = Text
End Sub
Delegate Sub UpdateLabelHandler(ByVal Text As String)
Sub Increment()
Dim i As Long = 0
Dim UpdateLabelDelegate …Run Code Online (Sandbox Code Playgroud) 我有以下EventHandler:
private EventHandler<MyEventArgs> _myEventHandler;
public event EventHandler<MyEventArgs> MyEvent
{
add { _myEventHandler += value; }
remove { _myEventHandler -= value; }
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释以下片段之间的区别吗?
Snippet EventHandler(A):
//Snippet A:
if (_myEventHandler != null)
{
_myEventHandler(new MyEventArgs());
}
Run Code Online (Sandbox Code Playgroud)
Snippet BeginInvoke(B):
//Snippet B:
if (_myEventHandler != null)
{
_myEventHandler.BeginInvoke(new MyEventArgs(), ar =>
{
var del = (EventHandler<MyEventArgs>)ar.AsyncState;
del.EndInvoke(ar);
}, _myEventHandler);
}
Run Code Online (Sandbox Code Playgroud)
澄清一下:调用EventHandler"就像它"和使用一样有什么区别BeginInvoke?
[编辑,完全改写:]似乎我的问题确实措辞不好,而且收到的也很差.所以我希望这个完整的改述有助于......
MSDN告诉清楚指定: Control.BeginInvoke()在创建控件的句柄的线程上执行委托,通常这将是GUI线程.和Dispatcher.BeginInvoke()将在其中创建调度对象的线程上运行.这将是我创建的任何线程.
但是对于代理" CLR自动定义 BeginInvoke和EndInvoke",这些调用在ThreadPool-thread上运行.除了这种略微令人惊讶的不同行为,我想知道如何找到自动实现的所有函数的规范.
例如:Intelli-sense显示我的委托有一个DynamicInvoke().类System.Delegate {}确实有一个DynamicInvoke(),这可能意味着我的委托继承了它.但Delegate {}没有BeginInvoke().而且委托{}有几个我的代表没有的功能.我的委托也得到一个GetObjectData()方法.这似乎来自ISerializable.
总而言之,一个委托似乎从(1)CLR"自动"获取其方法,(2)Delegate {}的某个子集可能是MulticastDelegate {},并且可能(3)ISerializble.我在哪里可以找到委托获得的所有方法的全面规范?特别有趣的是BeginInvoke(),它是精确的签名,因为前面提到的两个具有该名称的方法具有不同的签名集.
[有人在编辑中建议"委托"是"代表".我敢说,事实并非如此.
谢谢
在查看其他开发人员的代码时,我已经看到了这两个版本的代码:
1.
Me.BeginInvoke(New MethodInvoker(Sub() cbo.ShowPopup()))
Run Code Online (Sandbox Code Playgroud)
2.
Me.BeginInvoke(Sub()
cbo.ShowPopup()
End Sub)
Run Code Online (Sandbox Code Playgroud)
两种陈述是否相同,或者它们在某种程度上有所不同?另外,BeginInvoke()不是必需的EndInvoke()吗?
begininvoke ×10
c# ×6
.net ×3
invoke ×3
delegates ×1
mono ×1
msdn ×1
overriding ×1
timeout ×1
unit-testing ×1
vb.net ×1
virtual ×1