我不認爲這是「我想做同步呼叫」的問題。當你全部完成時,你真正要做的就是將一系列異步調用聯繫在一起。
我曾遇到過這種情況,你有一個項目列表,並需要從服務器異步獲取它們的屬性(例如一些狀態),但也想更新屏幕上的一些加載進度指示器。
在這種情況下,您不希望在更新所有項目時阻塞UI線程(如果有其他選擇,阻塞線程也是邪惡的)。
所以我用一個控制類是這樣的:
public class GroupAction
{
public delegate void ActionCompletion();
private uint _count = 0;
private ActionCompletion _callback;
private object _lockObject = new object();
public GroupAction(uint count, ActionCompletion callback)
{
_count = count;
_callback = callback;
}
public void SingleActionComplete()
{
lock(_lockObject)
{
if (_count > 0)
{
_count--;
if (_count == 0) _callback();
}
}
}
}
您創建一個計數(用於項目的數量),並且得到的所有項目完成後執行的回調這個動作。基本上就像一個控制更多,沒有線程擔心的信號量。
調用代碼看起來像這樣(我已經根據調用標準臨時轉換Web服務的例子,你可以在w3schools.com找到這個例子)。
private void DoGroupCall()
{
uint count = 5;
GroupAction action = new GroupAction(count,
() =>
{
MessageBox.Show("Finished All Tasks");
});
for (uint i = 0; i < count; i++)
{
TempConvertHttpPost proxy = new TempConvertHttpPostClient(new BasicHttpBinding(), new EndpointAddress("http://localhost/webservices/tempconvert.asmx"));
CelsiusToFahrenheitRequest request = new CelsiusToFahrenheitRequest() { Celsius = "100" };
proxy.BeginCelsiusToFahrenheit(request,
(ar) => Deployment.Current.Dispatcher.BeginInvoke(
() =>
{
CelsiusToFahrenheitResponse response = proxy.EndCelsiusToFahrenheit(ar);
// Other code presumably...
action.SingleActionComplete();
}
), null);
}
}
注意GroupAction實例是如何用一個內聯回調委託定義,然後SingleCallBack函數每次調用的服務回報。
希望這有助於...
Silverlight上的信號量? –