2012-01-27 84 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正式使用,但可能需要更多的努力重構代碼。