C# 在前一个事件的委托中调用其调用方时未触发事件处理程序

C# 在前一个事件的委托中调用其调用方时未触发事件处理程序,c#,C#,tl;dr 实现类: public Main() { Foo foo = new Foo(); foo.OnBarOneResponse += foo_OnBarOneResponse; foo.OnBarTwoResponse += foo_OnBarTwoResponse; foo.FetchBarOne(); } void foo_OnBarOneResponse(String response) { // Called successfully.

tl;dr

实现类:

public Main()
{
    Foo foo = new Foo();
    foo.OnBarOneResponse += foo_OnBarOneResponse;
    foo.OnBarTwoResponse += foo_OnBarTwoResponse;
    foo.FetchBarOne();
}

void foo_OnBarOneResponse(String response)
{
    // Called successfully.
    this.foo.FetchBarTwo();
}

void foo_OnBarTwoResponse(String response)
{
    // Never called :(
} 
Foo.cs

private MyJavascriptInjector _javascriptInjector = new MyJavascriptInjector();

public delegate void OnBarOneResponseHandler(String response);
public delegate void OnBarTwoResponseHandler(String response);
public event OnBarOneResponseHandler OnBarOneResponse = delegate { };
public event OnBarTwoResponseHandler OnBarTwoResponse = delegate { };

private void _onBarOneResponse(String response)
{
    // Called Successfully
    OnBarOneResponse(response);
}

private void _onBarTwoResponse(String response)
{
    // Never called :(
    OnBarTwoResponse(response);
}

public Foo() 
{
    webBrowser.ObjectForScripting = _javascriptInjector;
    _javascriptInjector.OnBarOneResponse += _onBarOneResponse;
    _javascriptInjector.OnBarTwoResponse += _onBarTwoResponse;
    webBrowser.Navigate("http://myurl", null, new Byte[0], myHeaders");
}

public void FetchBarOne()
{
    webBrowser.InvokeScript("fetchBarOne");
}

public void FetchBarTwo()
{
    webBrowser.InvokeScript("fetchBarTwo");
}
[System.Runtime.InteropServices.ComVisible(true)]
public class MyJavascriptInjector
{
    public delegate void OnBarOneResponseHandler(string response);
    public delegate void OnBarTwoResponseHandler(string response);
    public event OnBarOneResponseHandler OnBarOneResponse;
    public event OnBarTwoResponseHandler OnBarTwoResponse;

    public void OnBarOneResponse(String response)
    {
        // Called successfully!
        OnBarOneResponse(response);
    }

    public void OnBarTwoResponse(String response)
    {
        // ALSO CALLED SUCCESSFULLY BUT WHEN CALLING THIS Foo.cs event NEVER GETS FIRED.  
        // IT GETS LOST SOMEWHERE BETWEEN HERE and Foo.cs!
        OnBarTwoResponse(response);
    }
}
MyJavascriptInjector.cs

private MyJavascriptInjector _javascriptInjector = new MyJavascriptInjector();

public delegate void OnBarOneResponseHandler(String response);
public delegate void OnBarTwoResponseHandler(String response);
public event OnBarOneResponseHandler OnBarOneResponse = delegate { };
public event OnBarTwoResponseHandler OnBarTwoResponse = delegate { };

private void _onBarOneResponse(String response)
{
    // Called Successfully
    OnBarOneResponse(response);
}

private void _onBarTwoResponse(String response)
{
    // Never called :(
    OnBarTwoResponse(response);
}

public Foo() 
{
    webBrowser.ObjectForScripting = _javascriptInjector;
    _javascriptInjector.OnBarOneResponse += _onBarOneResponse;
    _javascriptInjector.OnBarTwoResponse += _onBarTwoResponse;
    webBrowser.Navigate("http://myurl", null, new Byte[0], myHeaders");
}

public void FetchBarOne()
{
    webBrowser.InvokeScript("fetchBarOne");
}

public void FetchBarTwo()
{
    webBrowser.InvokeScript("fetchBarTwo");
}
[System.Runtime.InteropServices.ComVisible(true)]
public class MyJavascriptInjector
{
    public delegate void OnBarOneResponseHandler(string response);
    public delegate void OnBarTwoResponseHandler(string response);
    public event OnBarOneResponseHandler OnBarOneResponse;
    public event OnBarTwoResponseHandler OnBarTwoResponse;

    public void OnBarOneResponse(String response)
    {
        // Called successfully!
        OnBarOneResponse(response);
    }

    public void OnBarTwoResponse(String response)
    {
        // ALSO CALLED SUCCESSFULLY BUT WHEN CALLING THIS Foo.cs event NEVER GETS FIRED.  
        // IT GETS LOST SOMEWHERE BETWEEN HERE and Foo.cs!
        OnBarTwoResponse(response);
    }
}
=================

我有一个对象Foo,上面有两个方法,FetchBarOneFetchBarTwo

每个方法上都有一个事件,OnBarOneResponseonbartworresponse

实现类使用符号“+=”在其构造函数中注册Foo的事件,并为每个事件定义回调函数:Foo\u OnBarOneResponse(字符串响应)Foo\u onbartworresponse(字符串响应)

问题:

public Main()
{
    Foo foo = new Foo();
    foo.OnBarOneResponse += foo_OnBarOneResponse;
    foo.OnBarTwoResponse += foo_OnBarTwoResponse;
    foo.FetchBarOne();
}

void foo_OnBarOneResponse(String response)
{
    // Called successfully.
    this.foo.FetchBarTwo();
}

void foo_OnBarTwoResponse(String response)
{
    // Never called :(
} 
实现类遵循以下内容:

  • 调用
    this.foo.FetchBarOne()
  • foo\u OnBarOneResponse(字符串响应)
    将在稍后启动
  • 在这个回调中,实现类立即调用
    this.foo.FetchBarTwo()
  • foo_onbartworresponse(字符串响应)
    从不触发
  • 更多信息:

    public Main()
    {
        Foo foo = new Foo();
        foo.OnBarOneResponse += foo_OnBarOneResponse;
        foo.OnBarTwoResponse += foo_OnBarTwoResponse;
        foo.FetchBarOne();
    }
    
    void foo_OnBarOneResponse(String response)
    {
        // Called successfully.
        this.foo.FetchBarTwo();
    }
    
    void foo_OnBarTwoResponse(String response)
    {
        // Never called :(
    } 
    
    Foo已包装并正在调用以在加载的网页中执行javascript。此网页上有许多javascript函数,包括FetchBarOneFetchBarTwo。调试时,调用FetchBarTwo,并成功响应数据。但是,在WebBrowser成功返回数据后,当Foo调用其内部OnBartworResponseHandler事件委托(该委托已由实现类注册)时,它会在两者之间的某个位置“丢失”——尽管它不是空的,但它显然有一个对它的引用

    修复问题的尝试失败

  • 尝试使用
    Dispatcher.Invoke(DispatcherPriority.Normal,newthreadstart(()=>this.foo.FetchBarTwo())实现类
    尝试从UI线程调用它。没有成功
  • 如果有人对此事有任何想法,我将不胜感激。谢谢

    this.foo
    字段与
    foo
    变量的实例不同

    从你的例子来看:

    public Main()
    {
        Foo foo = new Foo();
        foo.OnBarOneResponse += foo_OnBarOneResponse;
        foo.OnBarTwoResponse += foo_OnBarTwoResponse;
        foo.FetchBarOne();
    }
    
    void foo_OnBarOneResponse(String response)
    {
        // Called successfully.
        this.foo.FetchBarTwo();
    }
    
    private Foo foo;
    
    public Main()
    {
        this.foo = new Foo();
        this.foo.OnBarOneResponse += foo_OnBarOneResponse;
        this.foo.OnBarTwoResponse += foo_OnBarTwoResponse;
        this.foo.FetchBarOne();
    }
    
    尝试使用您的字段(示例中未包含该字段):


    10行代码比文字墙更能说明问题。我个人能比文本更容易地阅读代码。我相信这里的人也同意我的观点。谢谢。请看我的tl;博士在顶部编辑。我的眼睛,护目镜什么都不做。你只调用foo.FetchBarOne();你实际上在哪里提出第二个问题?@Chris它在问题的
    foo_OnBarOneResponse
    内。