[英]How to trigger CallBack method on carousel Hero Card action in Bot Framework 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.