C 同步和非同步(四)等待非同步呼叫完成

2021-10-03 05:31:16 字數 1575 閱讀 8687

如果有一種特殊需求,我們希望等待非同步呼叫結束後繼續執行後面的語句。這種形式和同步一樣。那麼怎麼實現呢?

下面介紹兩種實現方式:

1、簡單方式

利用iasyncresult中的iscompleted屬性。此屬性指示非同步呼叫是否成功完成。 begininvoke()方法返回值為iasyncresult型別資料。有關iasyncresult的具體定義如下:

// 摘要: 

// 表示非同步操作的狀態。

[comvisible(true)]

public inte***ce iasyncresult

//// 摘要:

// 獲取用於等待非同步操作完成的 system.threading.waithandle。

//// 返回結果:

// 用於等待非同步操作完成的 system.threading.waithandle。

waithandle asyncwaithandle

//// 摘要:

// 獲取乙個值,該值指示非同步操作是否同步完成。

//// 返回結果:

// 如果非同步操作同步完成,則為 true;否則為 false。

bool completedsynchronously

//// 摘要:

// 獲取乙個值,該值指示非同步操作是否已完成。

//// 返回結果:

// 如果操作完成則為 true,否則為 false。

bool iscompleted

}

第1種實現方式如下:

#region  //非同步等待呼叫方式1(現象與同步類似)

private void button4_click(object sender, eventargs e)

}//輸出結束時間,當前執行緒名

console.writeline("非同步等待1呼叫結束,當前執行緒為:" + thread.currentthread.managedthreadid.tostring("00") + '\n');

}#endregion

2、利用asyncwaithandle.waitone()來設定等待

#region  //非同步等待呼叫方式2

private void button5_click(object sender, eventargs e)

//輸出結束時間,當前執行緒名

console.writeline("非同步等待2呼叫結束,當前執行緒為:" + thread.currentthread.managedthreadid.tostring("00") + '\n');

}#endregion

上面兩種方法類似輸出的結果如下:

上述結果我們可以看出,利用非同步呼叫等待,可以控制非同步呼叫結束後才執行下一步驟。這種情況與同步效果類似,但區別是非同步呼叫的所用的執行緒仍然是新開闢的執行緒。

C 非同步同步呼叫

本文將主要通過 同步呼叫 非同步呼叫 非同步 三個示例來講解在用委託執行同乙個 加法類 的時候的的區別和利弊。首先,通過 定義乙個委託和下面三個示例將要呼叫的方法 新增的命名空間 using system.threading using system.runtime.remoting.messagi...

C 委託的同步呼叫和非同步呼叫

委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。同步呼叫的例子 using system using system.threading public delegate int addhandler int a,int b ...

C 委託的同步呼叫和非同步呼叫

委託的invoke方法用來進行同步呼叫。同步呼叫也可以叫阻塞呼叫,它將阻塞當前執行緒,然後執行呼叫,呼叫完畢後再繼續向下進行。同步呼叫的例子 using system using system.threading public delegate int addhandler int a,int b ...