我正在將使用基于回呼的 WCF Web 服務的舊 Silverlight 應用程式轉換為使用基于等待任務的 WCF Web 服務的 OpenSilver。我試圖弄清楚如何處理錯誤情況。這是基于回呼的代碼:
private void GetNextImage()
{
var cmc = ServiceFactories.CreateCartManager();
cmc.getSlideImageCompleted = (s, e) =>
{
cmc_getSlideImageCompleted(s, e);
};
var lastTime = SystemSettings.GetInstance().SlideShowData.LastImageTime;
cmc.getSlideImageAsync(string.IsNullOrEmpty(lastTime) ? null : lastTime);
}
void cmc_getSlideImageCompleted(object sender, getSlideImageCompletedEventArgs e)
{
if (e.Cancelled)
{
GetNextImage();
}
else if (e.Error != null)
{
var errMsg = new ErrorWindow("Error while trying to get next image in slide show:", msg);
errMsg.Show();
}
else if (e.Result == null)
{
// There are no images in the slide show right now.
}
else
{
// we have an image!!!!
var imageData = e.Result.imageData;
// <the rest of the code>
}
}
我知道 GetNextImage() 應該是這樣的:
private async Task GetNextImage()
{
var cmc = ServiceFactories.CreateCartManager();
var lastTime = SystemSettings.GetInstance().SlideShowData.LastImageTime;
var result = await cmc.getSlideImageAsync(string.IsNullOrEmpty(lastTime) ? null : lastTime);
cmc_getSlideImageCompleted(result);
}
void cmc_getSlideImageCompleted(getSlideImageResponse e)
{
...
}
問題是,e.Cancelled、e.Error 和 e.Result 發生了什么?我現在如何解釋較低級別的錯誤?
uj5u.com熱心網友回復:
e.Cancelled、e.Error 和 e.Result 發生了什么?
e.Cancelled
如果您有異步方法(在您的情況下是cmc.getSlideImageAsync),那么可以通過CancellationToken. 在此方法中,如果您反復檢查是否已請求取消(通過ThrowIfCancellationRequested),那么它將拋出一個OperationCanceledException(或派生類)。
所以,相當于e.Cancelled是這樣的:
getSlideImageResponse response;
try
{
response = await cmc.getSlideImageAsync(..., cancellationToken);
}
catch(OperationCanceledException ex)
{
//if(e.Cancelled) logic goes here
}
e.Error
如果您的 async 方法由于某種原因失敗,那么它將填充底層Task的Exception屬性。
Task<getSlideImageResponse> getTask = cmc.getSlideImageAsync(...);
getTask.Wait(); //BAD PRACTICE, JUST FOR DEMONSTRATION PURPOSES
if(getTask.Exception != null)
{
//if(e.Error != null) logic goes here
}
上面的代碼不是最理想的,因為它.Wait是一個阻塞呼叫并且可能導致死鎖。推薦的方法是使用await. 此運算子可以.Exception從 中檢索屬性Task并可以再次拋出它:
getSlideImageResponse response;
try
{
response = await cmc.getSlideImageAsync(...);
}
catch(Exception ex)
{
//if(e.Error != null) logic goes here
}
e.Result
僅當方法未取消或未失敗時才填充此屬性。這里也是如此:
getSlideImageResponse response;
try
{
response = await cmc.getSlideImageAsync(..., cancellationToken);
}
catch(OperationCanceledException ocex)
{
//if(e.Cancelled) logic goes here
}
catch(Exception ex)
{
//if(e.Error != null) logic goes here
}
//if(e.Result != null) logic goes here
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478918.html
標籤:C# 异步 任务并行库 wcf-ria-服务 c#-5.0
