主線程調用異步服務後,通過設定主線程的等待時間來進行逾時處理。
Demo如下:
using System.Threading;
namespace MyCSharp.ExternalService
{
public class DemoService
{
///
/// 服務響應
///
public void Response()
{
Thread.Sleep(100);
}
}
}using System;
using System.Threading.Tasks;
using MyCSharp.ExternalService;
namespace MyCSharp.Grammas
{
public class AsyncTask
{
private readonly int _timeout;
private AsyncTask()
{
}
///
/// 構造函數
///
///
逾時時間
public AsyncTask(Int32 timeout = 30000)
{
_timeout = timeout;
}
///
/// 執行任務
///
///
public bool Execute()
{
var task = Task.Factory.StartNew(this.CallExternalSevice);
return task.Wait(_timeout);
}
///
/// 調用外部服務
///
private void CallExternalSevice()
{
new DemoService().Response();
}
}
}
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MyCSharp.Grammas;
namespace MyCSharp.FunctionTests
{
[TestClass]
public class AsyncTaskTest
{
[TestMethod]
public void ExecuteTest_LessThanResponseTime_TimeOut()
{
var result = new AsyncTask(50).Execute();
Assert.IsFalse(result);
}
[TestMethod]
public void ExecuteTest_EqualsResponseTime_Success()
{
var result = new AsyncTask(100).Execute();
Assert.IsFalse(result);
}
[TestMethod]
public void ExecuteTest_MoreThanResponseTime_Success()
{
var result = new AsyncTask(120).Execute();
Assert.IsTrue(result);
}
}
}