2012-01-27 95 views
3

这是我的代码片段的一部分。 我想将回调函数传递给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); 
    //?????????? 
} 

回答

2

普莱塞,请尝试以下操作:

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); 
} 

也请看看下面的文章:Calling Synchronous Methods Asynchronously

0

您可以将委托作为参数传递给函数。因此,在'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(); 
    } 
} 
0

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

1)你可以修改

updateUIDelegate del = new updateUIDelegate(updateUI); 

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

我改变updateUIDelegatevar这里,因为updateUI的定义实际上不匹配updateUIDelegate

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

BeginInvoke(callback, null); 

这是更优雅或BeginInvoke正式使用,但可能需要更多的努力重构代码。