2012-01-27 8 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

Plesse、次のことを試してください:Calling Synchronous Methods Asynchronously

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

また、以下の記事をご覧ください

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ボタンを押します。そうであれば、2つの解決策があります。あなたがのupdateUIの定義は、実際にupdateUIDelegateと一致していないので、私はここにvarupdateUIDelegateを変更

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

updateUIDelegate del = new updateUIDelegate(updateUI); 

を変更することがあり

1)。

2)リファクタリングcallback()は、AsyncCallbackの定義と一致し、BeginInvoke()のパラメータとして渡します。つまり、

BeginInvoke(callback, null); 

これはBeginInvokeのよりエレガントなまたは正式な使用方法ですが、コードをリファクタリングするより多くの努力を必要とするかもしれません。

関連する問題