|
各位专家,
小弟想进一步了解一下回调函数的作用域问题。我知道很多的回调函数都是这么写:e.g
bool flag = false;
this.Client.GetClipboard( ( obj, args) => {
flag = true;
if(flag) { // do something }
});
如果写成如下内容, 是不工作的
bool flag = true;
this.Client.GetClipboard(( obj, args) => {
flag = true;
});
if(flag) { // do something }
我自己的理解是,由于回调函数被触发,和继续向下执行后续内容是同时进行的,因此上面的例子中,如果 if(flag) 判断放置在回调函数之外,它不能被设置成 true
但我想了解的是,回调函数的有效作用域是什么? 我试过了几个办法:
1. 加入延时命令, 这个不行,说明不是由于 回调函数没有执行完成而导致 flag 没能设置成 true
bool flag = false;
this.Client.GetClipboard(( obj, args) => {
flag = true;
});
Thread.Sleep(1000);
if(flag) { // do something }
2. 将回调函数放入子线程中,也不行,
private void CallbackFunc()
{
this.Client.GetClipboard(( obj, args) => {
flag = true;
});
Thread.Sleep(10000);
}
ThreadStart Thparm = new ThreadStart( CallbackFunc);
Thread Th1 = new Thread(Thparm);
Th1.Start();
Th1.Join(); // 等待子线程完成后,主线程才继续执行
if(flag) { // do something }
3. 如果是在另一个事件中 (比如一个button click 事件),就会发现,该flag已经被正确设置了:
private void Init_Load(object sender, EventArgs e) // ===> 窗体加载时执行回调
{
flag = false;
this.Client.GetClipboard(( obj, args) => {
flag = true;
});
}
private void button1_Press(object sender, EventArgs e)
{
if(flag) { // do something } // ====> 当触发button1 的click事件后, 在这里看到 flag是设置成true了。
}
我自己不太理解,第2种情况和第三种情况的区别在哪里? 看起来并不是由于第3种情况会在窗体加载和button事件触发之间的间隔比较长而造成的。
因为有时候,回调中需要处理的内容很多,如果全部放在回调函数中处理的话,会导致程序的可读性不好,不知道有没有什么办法来解决这个问题?
谢谢
大杰米
|
|