繁体   English   中英

C#如何触发回调?

[英]C# how to trigger a callback?

这是我的代码段的一部分。 我想将一个回调函数传递给test()。 因此,在调用“del”委托后,callback()可以自动触发吗?

职能:

butOK_Click()  //when click the button, disable it
test()  //a wrapper function calling updateUI function
updateUI() // a long process function
callback() // a callback function enabling the button back

我怎样才能做到这一点? 谢谢

public delegate void updateUIDelegate(bool refresh);
public delegate void asyncCallback();            
//...
void butOK_Click(object sender, EventArgs e) {
    butOK.Enabled = false;
    test();
} 
public void updateUI() {
    // long function....doing 10s
}
public void callback() {
    butOK.Enabled = true;
}
public void test() {
    updateUIDelegate del = new updateUIDelegate(updateUI);
    del.BeginInvoke(null,null);
    //??????????
}

Plesse,请尝试以下方法:

void button1_Click(object sender, EventArgs e) {
    button1.Enabled = false;
    BeginAsyncOperation(updateUI);
}
void BeginAsyncOperation(Action operation) {
    operation.BeginInvoke(OnAsyncCallback, null);
}
void OnAsyncCallback(IAsyncResult result) {
    if(result.IsCompleted) {
        if(!InvokeRequired)
            callback();
        else BeginInvoke(new Action(callback));
    }
}
//
public void callback() {
    button1.Enabled = true;
    // something else
}
public void updateUI() {
    // long function....doing 10s
    System.Threading.Thread.Sleep(10000);
}

另请参阅以下文章: 异步调用同步方法

您可以将委托作为参数传递给函数。 因此,在'asyncCallback'类型的方法'Test'中添加一个参数。 然后在'test'方法中,您可以调用传入的委托方法。

以下是一些示例代码:

class MyClass {

    public delegate void updateUIDelegate(bool refresh);
    public delegate void asyncCallback();            

    private void butOK_Click(object sender, EventArgs e)
    {
        butOK.Enabled = false;
        test(new asyncCallback(callback));
    }

    public void updateUI(bool refresh)
    {
        // long function....doing 10s
    }

    public void callback()
    {
        butOK.Enabled = true;
    }

    public void test(asyncCallback callbackMethod)
    {
        updateUIDelegate del = new updateUIDelegate(updateUI);
        del.BeginInvoke(true, null, null);

        if(callbackMethod != null) callback();
    }
}

不确定我是否理解正确,但我认为你想在更新UI后重新启用butOK按钮。 如果是这样,有两种解决方案。

1)您可以修改

updateUIDelegate del = new updateUIDelegate(updateUI);

var del = new Action(() => { updateUI(); callback(); });

我在这里将updateUIDelegate更改为var ,因为updateUI的定义实际上与updateUIDelegate不匹配。

2)重构callback()以匹配AsyncCallback的定义,并将其作为BeginInvoke()的参数传递。 那是,

BeginInvoke(callback, null);

这是BeginInvoke更优雅或官方用法,但可能需要更多努力来重构代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM