1. 程式人生 > >C#: 一個方法執行超時 timeout 檢查的實現

C#: 一個方法執行超時 timeout 檢查的實現

我們經常有這樣的需求:如果一個方法的執行,超過了一個設定時間(timeout)就需要立即返回不再繼續,這裡我利用 C# 非同步委託的 AsyncWaitHandle 來儘量簡便的實現這一需求。

具體實現如下。注意,這裡需要被呼叫的方法遵守 delegate TR TimeOutDelegate(T param); 形式的方法簽名,如有其他需要,可以自行定製也很方便。

[csharp]
namespace TimeOutHelper
{
#region using directives

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading;

#endregion using directives

internal class Program
{
public delegate TR TimeOutDelegate<in T, out TR>(T param);

private static void Main()
{
Dictionary<Guid, string> result;
Console.WriteLine(TimeoutFunction.Execute(Test, "Hello, World!", out result, TimeSpan.FromSeconds(3)));
Console.WriteLine("Hello, World!");
Console.ReadKey();
}

public static Dictionary<Guid, string> Test(string sourceString)
{
var result = sourceString.ToDictionary(
character => Guid.NewGuid(),
character => character.ToString(CultureInfo.InvariantCulture));
Thread.Sleep(4000);
return result;
}

public static class TimeoutFunction
{
/// <summary>
/// Execute a method with timeout check
/// </summary>
/// <typeparam name="T">Target method parameter type</typeparam>
/// <typeparam name="TR">The result type of execution</typeparam>
/// <param name="timeoutMethod">Target method</param>
/// <param name="param">Target method parameter</param>
/// <param name="result">The result of execution</param>
/// <param name="timeout">Set timeout length</param>
/// <returns>Is timeout</returns>
public static Boolean Execute<T, TR>(
TimeOutDelegate<T, TR> timeoutMethod, T param, out TR result, TimeSpan timeout)
{
var asyncResult = timeoutMethod.BeginInvoke(param, null, null);
if (!asyncResult.AsyncWaitHandle.WaitOne(timeout, false))
{
result = default(TR);
return true;
}
result = timeoutMethod.EndInvoke(asyncResult);
return false;
}
}
}
}
[/csharp]

相關推薦

C#: 一個方法執行超時 timeout 檢查實現

我們經常有這樣的需求:如果一個方法的執行,超過了一個設定時間(timeout)就需要立即返回不再繼續,這裡我利用 C# 非同步委託的 AsyncWaitHandle 來儘量簡便的實現這一需求。 具體實現如下。注意,這裡需要被呼叫的方法遵守 delegate TR Time

一個非同步執行緒的簡單實現

// 這裡用一個執行緒就是非同步 new Thread(new Runnable() { @Override public void run() { int i =

利用Thread.stop方法完成方法執行超時中斷

一、業務場景:   系統中存在多種場景併發操作事務執行時互鎖的情況,導致任務積壓,系統崩潰。先做了各場景業務的效能調整,但是併發互鎖依然無法避免。於是開始考慮選取呼叫頻繁的同步功能作為死鎖的犧牲品,取消執行,釋放鎖。 二、處理方案:   由於FutureTask.cancel方案無法解決資料庫死鎖問題。

c語言 多執行緒的簡單實現 執行緒鎖

#include <stdio.h> #include <math.h> #include <pthread.h> #include <stdlib.h> #include <string.h> #i

C#監測方法執行效率

工作中遇到一個需求,就是檢測一下C#程式碼中某個方法的執行效率是怎麼樣的,搜尋了一下感覺這個方法換是比較靠譜,也比較簡單,記錄一下,便於以後使用。 System.Diagnostics.Stopwatch stopwatch = new Stopw

C++11簡化執行緒池的實現

我想用C語言寫過執行緒池的朋友因該都知道用C語言寫一個執行緒池有多麼的麻煩,程式碼差不多300行左右,而且不易閱讀。記得大二寒假第一次寫執行緒池用的就是C語言,當時先參考了別人用C寫的程式碼,說實話看起來真困難,因為C寫出來的結構好亂,程式碼又多。 我最近在實

關於 C#呼叫一個C/C++dll庫執行實現多個應用(靜態變數區分) 的解決方法

需求         VS編寫了純C(windows)通訊庫,需要多例項(靜態變數標誌一個例項,達到互相靜態變數不干涉)。   當前問題         dll中使用了全域性static的標

呼叫一個方法,直接實現執行執行任務

import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import ja

C#實現資料回滾,A事件和B事件同時執行,其中任何一個事件執行失敗,都會返回失敗

  /// <summary> /// 執行資料庫回滾操作,用於sql語句執行失敗後,恢復執行前的資料 /// </summary> /// <param name="TableName">目標表</param> /// <param

c語言通過cond和mutex實現一個高效能執行緒池

首先說明一下這篇文章其實和我另一篇文章很像,只是另一篇只有一個執行緒,只要講述的是cond和mutex的使用,上面是基於c++實現的,封裝的稍微好一些,路徑: https://blog.csdn.net/FlayHigherGT/article/details/83830956 而下面是

C# 給某個方法設定執行超時時間

在某些情況下(例如通過網路訪問資料),常常不希望程式卡住而佔用太多時間以至於造成介面假死。 在這時、我們可以通過Thread、Thread + Invoke(UI)或者是 delegate.BeginInvoke 來避免介面假死, 但是這樣做時,某些程式碼或者是某個方法的

[c/c++] 一個程序有多個執行緒,用什麼方法讓主執行緒不退出更好,佔用資源最少,效率最高?

[c/c++] 一個程序有多個執行緒,用什麼方法讓主執行緒不退出更好,要求佔用資源最少,效率最高? 我所知道的不讓主執行緒退出的方法有: 一,死迴圈:while(1);/ for(;;); 二,pause(); 讓主執行緒暫停等待訊號使其退出 三,另一種死迴圈whil

Java實現限定方法執行時間-java 1.5以上的Future類可以執行超時處理

開發場景中有是需要對響應時間較長的介面或者方法進行處理,比如跳過繼續執行,或者其它的方式,這個可以使用Future實現: 程式碼 // 設定BI返回資料最長時間,如果超過此時間則跳過 Callable<String> cal

C# 多執行緒 用委託實現非同步_呼叫委託的BeginInvoke和EndInvoke方法

1.C#中的每一個委託都內建了BeginInvoke和EndInvoke方法,如果委託的方法列表裡只有一個方法,那麼這個方法就可以非同步執行(不在當前執行緒裡執行,另開闢一個執行緒執行)。委託的BeginInvoke和EndInvoke方法就是為了上述目的而生的。 2.原始

C#專案實戰-實現一個執行緒埠掃描器

歡迎Follow,或者給個Star哈 PortScanner專案(C#實現多執行緒埠掃描器)說明 1. 概述 檔案結構 1.1 課程設計目的 加深TCP/IP協議的理解,掌握TCP四次握手機制,同時熟悉socket程

c#winform主題實現一個方法

winform的主題實現沒有bs裡面那麼舒服,下面做了一個簡單實現,記錄一下。 1、一個介面,需要做主題的控制元件、窗體都要實現這個介面 /// <summary> /// 使用主題的控制元件、窗體需要實現此介面 /// </summary> public

通過編寫c語言程序,運行時實現打印另一個程序的源代碼和行號

clas 行號 意義 spa clu 可執行 stdlib.h 讀取 進行 2017年6月1日程序編寫說明: 1.實現行號的打印,實現代碼的讀取和輸出,理解主函數中的參數含義。 2.對fgets函數理解不夠 3.對return(1); return 0的含義理解不夠 4.未

C#.NET 程序員的福利,自己寫的一個XML操作類,可實現像jquery一樣方便的xml操作,且不用專門去處理命名空間。

console region ignorecas node 處理 命名空間 void clone 一個 此工具是進入一家新公司之後實現的,主要是工作當中操作 xml 的時間太多,因為公司按任務計“工作量”,領導給我安排的時間遠遠不夠完善此工具【悲哀的

js通過一個方法實現對象的深淺拷貝。

str else xtend color extend log typeof ror defined 眾所周知,對象的深淺拷貝是工作中肯定會遇到的問題。所以,今天考慮寫個小的功能來記錄一下 //type:boolean,true-deep,true為深拷貝, functi

C# 更新Mongodb子文檔的實現方法

target person mod for builder pda log date() upd 參考資源:   1:mongodb3.2系統性學習——3、update()操作   2: C# 操作mongodb子文檔 代碼如下: var mongoString =