主線程調用異步服務后,通過設定主線程的等待時間來進行超時處理。
Demo如下:
Demo如下:
?
AsyncTask.cs?
?


?1?using?System;
?2?using?System.Threading.Tasks;
?3?using?MyCSharp.ExternalService;
?4?
?5?namespace?MyCSharp.Grammas
?6?{
?7?????public?class?AsyncTask
?8?????{
?9?????????private?readonly?int?_timeout;
10?
11?????????private?AsyncTask()
12?????????{
13?????????}
14?
15?????????///?<summary>
16?????????///?構造函數
17?????????///?</summary>
18?????????///?<param?name="timeout">超時時間</param>
19?????????public?AsyncTask(Int32?timeout?=?30000)
20?????????{
21?????????????_timeout?=?timeout;
22?????????}
23?
24?????????///?<summary>
25?????????///?執行任務
26?????????///?</summary>
27?????????///?<returns></returns>
28?????????public?bool?Execute()
29?????????{
30?????????????var?task?=?Task.Factory.StartNew(this.CallExternalSevice);
31?????????????return?task.Wait(_timeout);
32?
33?????????}
34?
35?????????///?<summary>
36?????????///?調用外部服務
37?????????///?</summary>
38?????????private?void?CallExternalSevice()
39?????????{
40?????????????new?DemoService().Response();
41?????????}
42?
43?
44?????}
45?}
?2?using?System.Threading.Tasks;
?3?using?MyCSharp.ExternalService;
?4?
?5?namespace?MyCSharp.Grammas
?6?{
?7?????public?class?AsyncTask
?8?????{
?9?????????private?readonly?int?_timeout;
10?
11?????????private?AsyncTask()
12?????????{
13?????????}
14?
15?????????///?<summary>
16?????????///?構造函數
17?????????///?</summary>
18?????????///?<param?name="timeout">超時時間</param>
19?????????public?AsyncTask(Int32?timeout?=?30000)
20?????????{
21?????????????_timeout?=?timeout;
22?????????}
23?
24?????????///?<summary>
25?????????///?執行任務
26?????????///?</summary>
27?????????///?<returns></returns>
28?????????public?bool?Execute()
29?????????{
30?????????????var?task?=?Task.Factory.StartNew(this.CallExternalSevice);
31?????????????return?task.Wait(_timeout);
32?
33?????????}
34?
35?????????///?<summary>
36?????????///?調用外部服務
37?????????///?</summary>
38?????????private?void?CallExternalSevice()
39?????????{
40?????????????new?DemoService().Response();
41?????????}
42?
43?
44?????}
45?}
?AsyncTaskTest.cs
?


?1?using?Microsoft.VisualStudio.TestTools.UnitTesting;
?2?using?MyCSharp.Grammas;
?3?
?4?namespace?MyCSharp.FunctionTests
?5?{
?6?????[TestClass]
?7?????public?class?AsyncTaskTest
?8?????{
?9?????????[TestMethod]
10?????????public?void?ExecuteTest_LessThanResponseTime_TimeOut()
11?????????{
12?????????????var?result?=?new?AsyncTask(50).Execute();
13?????????????Assert.IsFalse(result);
14?????????}
15?
16?????????[TestMethod]
17?????????public?void?ExecuteTest_EqualsResponseTime_Success()
18?????????{
19?????????????var?result?=?new?AsyncTask(100).Execute();
20?????????????Assert.IsFalse(result);
21?????????}
22?
23?????????[TestMethod]
24?????????public?void?ExecuteTest_MoreThanResponseTime_Success()
25?????????{
26?????????????var?result?=?new?AsyncTask(120).Execute();
27?????????????Assert.IsTrue(result);
28?????????}
29?????}
30?}
?2?using?MyCSharp.Grammas;
?3?
?4?namespace?MyCSharp.FunctionTests
?5?{
?6?????[TestClass]
?7?????public?class?AsyncTaskTest
?8?????{
?9?????????[TestMethod]
10?????????public?void?ExecuteTest_LessThanResponseTime_TimeOut()
11?????????{
12?????????????var?result?=?new?AsyncTask(50).Execute();
13?????????????Assert.IsFalse(result);
14?????????}
15?
16?????????[TestMethod]
17?????????public?void?ExecuteTest_EqualsResponseTime_Success()
18?????????{
19?????????????var?result?=?new?AsyncTask(100).Execute();
20?????????????Assert.IsFalse(result);
21?????????}
22?
23?????????[TestMethod]
24?????????public?void?ExecuteTest_MoreThanResponseTime_Success()
25?????????{
26?????????????var?result?=?new?AsyncTask(120).Execute();
27?????????????Assert.IsTrue(result);
28?????????}
29?????}
30?}
?DemoService.cs


?1?using?System.Threading;
?2?
?3?namespace?MyCSharp.ExternalService
?4?{
?5?????public?class?DemoService
?6?????{
?7?????????///?<summary>
?8?????????///?服務響應
?9?????????///?</summary>
10?????????public?void?Response()
11?????????{
12?????????????Thread.Sleep(100);
13?????????}
14?????}
15?}
?2?
?3?namespace?MyCSharp.ExternalService
?4?{
?5?????public?class?DemoService
?6?????{
?7?????????///?<summary>
?8?????????///?服務響應
?9?????????///?</summary>
10?????????public?void?Response()
11?????????{
12?????????????Thread.Sleep(100);
13?????????}
14?????}
15?}
?