如题所述
å¼æ¥åè°å°±æ¯å起请æ±åï¼ä¸çå¾
ååºå°±å
å»å¤çèªå·±çååºï¼å®ä¸æ¯å¤çæ´ä¸ªè¯·æ±ï¼åªæ¯å¤çä¸å°é¨åï¼å¨Web页ä¸å°±è¡¨ç°ä¸ºé¡µé¢æ²¡å·æ°ï¼å´å±é¨æ´æ°äºæ°æ®ã
ç¸å¯¹äºåæ¥å°±æ¯å¿ é¡»çå°ååºè¯¥è¯·æ±åæè½åå«çäºï¼å ·ä½å°Web页就æ¯æ´ä¸ªé¡µé¢å·æ°äºï¼æ°æ®ææ´æ°ã
ä¸é¢ä¸¾ä¸¤ä¸ªååï¼
é¦å 举个åæ¥è°ç¨çä¾åï¼
æ¯å¦ä½ çç¨åºè°ç¨äºä¸ä¸ªæ¹æ³ï¼è¿ä¸ªæ¹æ³è¦æ§è¡å¾é¿å¾é¿æ¶é´ï¼èä¸è¿ä¸ªæ¶é´é½ä¸ç¡®å®ï¼ä¼ ç»çåæ³å°±æ¯âåæ¥è°ç¨âï¼å¦ä¸ï¼
private int Func()
{
// è¿ä¸ªæ¹æ³è¦æ§è¡å¾é¿æ¶é´ï¼å¹¶ä¸è¿åä¸ä¸ªintçå¼ã
}
private void A()
{
int n = Func();
textBox1.Text = n.ToString();
// è¿éå¾å°çnå°±æ¯Funcæ§è¡åºæ¥çç»æï¼å¹¶ä¸æ¾ç¤ºå¨textBox1ä¸ã
}
éç¨ä¸è¿°æ¹æ³ï¼å¯ä»¥å«ååæ¥è°ç¨ï¼å¾ææ¾å®æä¸ä¸ªç¼ºç¹ï¼
Funcæ¹æ³æ§è¡çæ¶é´è¿é¿ï¼ç¨åºä¼é»å¡ï¼å¹¶ä¸æ æ³ç»§ç»æ§è¡å ¶ä»ç代ç ï¼ç»ç¨æ·çä½éªå°±æ¯æ´ä¸ªç¨åºé½ä¼åµçï¼æå¼ä»»å¡ç®¡çå¨ä¼æ示该ç¨åºæ²¡æååºï¼ç¨æ·ä»¥ä¸ºç¨åºæ»äºï¼å°±ä¼æå¨ç»æè¿ä¸ªç¨åºï¼
èå¼æ¥è°ç¨å°±ä¸ä¸æ ·ï¼å¨è°ç¨å®Funcè¿ä¸ªæ¹æ³åï¼ä¸å¿ çå¾ Funcæ§è¡å®ï¼å°±å¯ä»¥æ§è¡å ¶ä»ç代ç ï¼ç´å°Funcæ§è¡å®ï¼ææç»æè¿åï¼
å¦æFuncæä¾äºå¼æ¥æ¹æ³FuncAsync()ï¼å°±å¯ä»¥è¿æ ·è°ç¨ï¼
private void A()
{
FuncAsync();
// è¿éæ§è¡FuncAsyncæ¹æ³ï¼å¹¶ä¸ä¼é»å¡ï¼ç¨åºä¼å¨åå°æ§è¡å®FuncAsyncæ¹æ³åï¼èªå¨è°ç¨FuncCompletedæ¹æ³ï¼å¹¶ä¸æç»æä¼ è¿å»ã
}
private void FuncCompleted(int n)
{
textBox1.Text = n.ToString();
// åæ°nå°±æ¯å¼æ¥åè°è¿åçç»æï¼
}
å¼æ¥åè°éè¦ç¼å代ç æè½æ¯æï¼ç½ç»ä¼ è¾æ¹é¢çç±»åºä¸è¬é½æä¾å¼æ¥æ¹æ³ï¼å¦socketç¼ç¨ï¼webæå¡ï¼ajaxï¼wcfçï¼æäºå¼æ¥æ¯åä¸ä¸ªçº¿ç¨å®æçï¼æäºå¼æ¥æ¯ä¸åç线ç¨ï¼æ以åè°å½æ°éè¦æ´æ°æ§ä»¶é½ä¼æ示跨线ç¨è®¿é®æ§ä»¶çé误æ示ã
该æç« è½¬èªï¼ç«ç¹åºå°
ç¸å¯¹äºåæ¥å°±æ¯å¿ é¡»çå°ååºè¯¥è¯·æ±åæè½åå«çäºï¼å ·ä½å°Web页就æ¯æ´ä¸ªé¡µé¢å·æ°äºï¼æ°æ®ææ´æ°ã
ä¸é¢ä¸¾ä¸¤ä¸ªååï¼
é¦å 举个åæ¥è°ç¨çä¾åï¼
æ¯å¦ä½ çç¨åºè°ç¨äºä¸ä¸ªæ¹æ³ï¼è¿ä¸ªæ¹æ³è¦æ§è¡å¾é¿å¾é¿æ¶é´ï¼èä¸è¿ä¸ªæ¶é´é½ä¸ç¡®å®ï¼ä¼ ç»çåæ³å°±æ¯âåæ¥è°ç¨âï¼å¦ä¸ï¼
private int Func()
{
// è¿ä¸ªæ¹æ³è¦æ§è¡å¾é¿æ¶é´ï¼å¹¶ä¸è¿åä¸ä¸ªintçå¼ã
}
private void A()
{
int n = Func();
textBox1.Text = n.ToString();
// è¿éå¾å°çnå°±æ¯Funcæ§è¡åºæ¥çç»æï¼å¹¶ä¸æ¾ç¤ºå¨textBox1ä¸ã
}
éç¨ä¸è¿°æ¹æ³ï¼å¯ä»¥å«ååæ¥è°ç¨ï¼å¾ææ¾å®æä¸ä¸ªç¼ºç¹ï¼
Funcæ¹æ³æ§è¡çæ¶é´è¿é¿ï¼ç¨åºä¼é»å¡ï¼å¹¶ä¸æ æ³ç»§ç»æ§è¡å ¶ä»ç代ç ï¼ç»ç¨æ·çä½éªå°±æ¯æ´ä¸ªç¨åºé½ä¼åµçï¼æå¼ä»»å¡ç®¡çå¨ä¼æ示该ç¨åºæ²¡æååºï¼ç¨æ·ä»¥ä¸ºç¨åºæ»äºï¼å°±ä¼æå¨ç»æè¿ä¸ªç¨åºï¼
èå¼æ¥è°ç¨å°±ä¸ä¸æ ·ï¼å¨è°ç¨å®Funcè¿ä¸ªæ¹æ³åï¼ä¸å¿ çå¾ Funcæ§è¡å®ï¼å°±å¯ä»¥æ§è¡å ¶ä»ç代ç ï¼ç´å°Funcæ§è¡å®ï¼ææç»æè¿åï¼
å¦æFuncæä¾äºå¼æ¥æ¹æ³FuncAsync()ï¼å°±å¯ä»¥è¿æ ·è°ç¨ï¼
private void A()
{
FuncAsync();
// è¿éæ§è¡FuncAsyncæ¹æ³ï¼å¹¶ä¸ä¼é»å¡ï¼ç¨åºä¼å¨åå°æ§è¡å®FuncAsyncæ¹æ³åï¼èªå¨è°ç¨FuncCompletedæ¹æ³ï¼å¹¶ä¸æç»æä¼ è¿å»ã
}
private void FuncCompleted(int n)
{
textBox1.Text = n.ToString();
// åæ°nå°±æ¯å¼æ¥åè°è¿åçç»æï¼
}
å¼æ¥åè°éè¦ç¼å代ç æè½æ¯æï¼ç½ç»ä¼ è¾æ¹é¢çç±»åºä¸è¬é½æä¾å¼æ¥æ¹æ³ï¼å¦socketç¼ç¨ï¼webæå¡ï¼ajaxï¼wcfçï¼æäºå¼æ¥æ¯åä¸ä¸ªçº¿ç¨å®æçï¼æäºå¼æ¥æ¯ä¸åç线ç¨ï¼æ以åè°å½æ°éè¦æ´æ°æ§ä»¶é½ä¼æ示跨线ç¨è®¿é®æ§ä»¶çé误æ示ã
该æç« è½¬èªï¼ç«ç¹åºå°
温馨提示:答案为网友推荐,仅供参考
第1个回答 2011-07-06
把你的程序改成这样你就清楚了:
class Program
{
public delegate void takedelegate(int ms);
public static void takeMethod(int ms)
{
Thread.Sleep(ms);
}
static void Main(string[] args)
{
takedelegate dl = takeMethod;
IAsyncResult ar = dl.BeginInvoke(3000, takecompleted, new object[] );
//dl.EndInvoke(ar);
Console.WriteLine("开始执行");
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
if (ar.IsCompleted)
{
Console.WriteLine("执行完毕 ");
break;
}
}
Console.Read();
}
static void takecompleted(IAsyncResult ar)
{
object[] myObject = ar.AsyncState as object[];
Console.WriteLine(Environment.NewLine);
if(ar.IsCompleted)
Console.Write("In callback. The parameters lengh is " + myObject.Length);
Console.WriteLine(Environment.NewLine);
}
}
当调用BeginInvoke时,程序将启动一个新的线程去执行takeMethod()方法,并返回一个实现IAsyncResult接口的对象,该对象有两个重要的属性:AsyncState(object)跟IsCompleted(bool),前个属性的值正是BeginInvoke()方法第三个参数值为object对象(楼主的例子传的是自己本身),所以在Callback方法takecompleted()中,就能通过ar.AsyncState拿到这个参数对象,至于为什么是takecompleted(IAsyncResult ar)这样的格式,那就得去问M$。何时知道异步方法执行完了,那就得靠IsCompleted这个属性了,true是,false否.
注意takecompleted()和takeMethod()都是在异步线程里执行的,异步方法调用也实现了不同线程间传递数据哦。
Endinvoke()唯一的参数就是一个IAsyncResult对象,是由BeginInvoke()返回的,调用Endinvoke()时,会一直租塞当前线程,直到异步方法takeMethod()执行完,去掉注释代码运行看效果。
另外,团IDC网上有许多产品团购,便宜有口碑
class Program
{
public delegate void takedelegate(int ms);
public static void takeMethod(int ms)
{
Thread.Sleep(ms);
}
static void Main(string[] args)
{
takedelegate dl = takeMethod;
IAsyncResult ar = dl.BeginInvoke(3000, takecompleted, new object[] );
//dl.EndInvoke(ar);
Console.WriteLine("开始执行");
for (int i = 0; i < 100; i++)
{
Console.Write(".");
Thread.Sleep(50);
if (ar.IsCompleted)
{
Console.WriteLine("执行完毕 ");
break;
}
}
Console.Read();
}
static void takecompleted(IAsyncResult ar)
{
object[] myObject = ar.AsyncState as object[];
Console.WriteLine(Environment.NewLine);
if(ar.IsCompleted)
Console.Write("In callback. The parameters lengh is " + myObject.Length);
Console.WriteLine(Environment.NewLine);
}
}
当调用BeginInvoke时,程序将启动一个新的线程去执行takeMethod()方法,并返回一个实现IAsyncResult接口的对象,该对象有两个重要的属性:AsyncState(object)跟IsCompleted(bool),前个属性的值正是BeginInvoke()方法第三个参数值为object对象(楼主的例子传的是自己本身),所以在Callback方法takecompleted()中,就能通过ar.AsyncState拿到这个参数对象,至于为什么是takecompleted(IAsyncResult ar)这样的格式,那就得去问M$。何时知道异步方法执行完了,那就得靠IsCompleted这个属性了,true是,false否.
注意takecompleted()和takeMethod()都是在异步线程里执行的,异步方法调用也实现了不同线程间传递数据哦。
Endinvoke()唯一的参数就是一个IAsyncResult对象,是由BeginInvoke()返回的,调用Endinvoke()时,会一直租塞当前线程,直到异步方法takeMethod()执行完,去掉注释代码运行看效果。
另外,团IDC网上有许多产品团购,便宜有口碑
第2个回答 2011-06-29
找了一个文库文章,可以看一下
第3个回答 2011-06-29
一般是你把回调的方法代理传给调用函数
第4个回答 2011-06-29
你能把问题说的详细点嘛????
第5个回答 2011-06-29
要通过代理来进行