C#如何触发回调?
问题描述:
这是我的代码片段的一部分。 我想将回调函数传递给test()。 因此,在调用“del”委托之后,callback()可以被自动触发?C#如何触发回调?
功能:
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);
//??????????
}
答
普莱塞,请尝试以下操作:
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'中添加一个参数。然后在“测试”的方法,你可以只调用传递的委托方法
下面是一些示例代码:
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
正式使用,但可能需要更多的努力重构代码。