标签: begininvoke

超时后是否需要调用EndInvoke?

在网页上,我正在呼叫第三方,它不允许我以编程方式设置超时.我调用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)

timeout begininvoke

9
推荐指数
1
解决办法
4894
查看次数

在MulticastDelegate上调用BeginInvoke?

根据Jon Skeet的说法,"您只能在具有单个目标调用的委托上调用BeginInvoke."

这是为什么?真正的原因是什么?

注意:为了澄清(因为我犯了这个错误),我说的BeginInvoke是代表,而不是控件.

.net c# begininvoke multicastdelegate

9
推荐指数
1
解决办法
1471
查看次数

为什么我的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确保调用的代码在另一个线程中运行.谢谢!

c# multithreading begininvoke

8
推荐指数
2
解决办法
6169
查看次数

如何在Action上单元测试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)

.net c# unit-testing begininvoke

8
推荐指数
1
解决办法
2568
查看次数

通过委托执行可覆盖方法时,Invoke()和BeginInvoke()的行为方式不同

谁能告诉我为什么这段代码的行为方式呢?查看代码中嵌入的评论......

我错过了一些非常明显的东西吗?

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)

virtual delegates overriding invoke begininvoke

7
推荐指数
1
解决办法
1509
查看次数

Delegate.BeginInvoke延迟

有时,当调用Delegate.BeginInvoke时,执行委托方法需要一秒以上的时间.

延迟的原因是什么?我在一个连续运行的应用程序中每天发出1到2次这个问题.

请帮我.

谢谢!

c# multithreading begininvoke

7
推荐指数
2
解决办法
4035
查看次数

单声道挂起和MS.Net没有的线程问题

我正在使用单声道测试我的应用程序预装Linux端口,我有一个线程问题.我最初考虑在这里粘贴3000个代码行,但最后我设计了一个小的最小例子;)

你有一个带有按钮的表单(诗意地命名Button1,并且有一个标签(毫无意外地带有名称Label1)).整个地段都在一个叫做的形式上过着幸福的生活Form1.单击Button1启动无限循环,增加本地计数器并更新Label1(使用Invoke)以反映其值.

现在在Mono中,如果您调整表单大小,标签将停止更新,永远不会重新启动.MS实现不会发生这种情况.BeginInvoke没有更好的工作; 更糟糕的是,它使UI在两种情况下都挂起.

你知道这种差异来自哪里吗?你会如何解决它?最后,为什么BeginInvoke不在这里工作?我一定是犯了一个大错...但是哪个?


编辑:到目前为止取得了一些进展:

  • 调用BeginInvoke确实可以工作; 只是,UI只是没有足够快地刷新,所以它似乎停止了.
  • 在单声道上,当您在UI队列中插入消息时(例如通过调整表单大小),整个线程会挂起.实际上,同步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)

mono multithreading invoke begininvoke

7
推荐指数
1
解决办法
2519
查看次数

调用EventHandler

我有以下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

c# event-handling begininvoke

7
推荐指数
2
解决办法
2万
查看次数

CLR定义的方法如[委托] .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(),它是精确的签名,因为前面提到的两个具有该名称的方法具有不同的签名集.

[有人在编辑中建议"委托"是"代表".我敢说,事实并非如此.

谢谢

c# documentation msdn begininvoke

7
推荐指数
2
解决办法
3196
查看次数

使用/不使用MethodInvoker的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()吗?

.net vb.net multithreading invoke begininvoke

6
推荐指数
1
解决办法
435
查看次数