gpt4 book ai didi

c# - 使用 TransactionScope 使常规(非数据库相关)c# 代码超时

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:22 24 4
gpt4 key购买 nike

我正在尝试使用 TransactionScope 类为代码执行设置特定的超时时间。更具体地说,

static void Main(string[] args)
{
int counter = 0;
try
{
using (var scope = new TransactionScope(TransactionScopeOption.Required, new TimeSpan(0, 0, 5)))
{
for (int i = 0; i < 50000; i++)
{
Console.WriteLine("Counter : {0}", counter);
counter++;
Thread.Sleep(100);
}

scope.Complete();
}
}
catch (Exception ex)
{

Console.WriteLine("Exception : {0}", ex);
}
}

在阅读了一些有关 TransactionScope 的内容后,我预计 using 语句中的上述代码块将在 5 秒内中止。

但它的行为并非如此。无论事务超时如何(这是我没想到的),for 循环都会继续进行。当 i = 50000 时 for 循环的执行结束,并且在 using 语句结束后出现以下异常:

Exception : System.Transactions.TransactionAbortedException: The transaction has aborted. ---> System.TimeoutException: Transaction Timeout
--- End of inner exception stack trace ---
at System.Transactions.TransactionStateAborted.BeginCommit(InternalTransaction tx, Boolean asyncCommit, AsyncCallback asyncCallback, Object asyncState)
at System.Transactions.CommittableTransaction.Commit()
at System.Transactions.TransactionScope.InternalDispose()
at System.Transactions.TransactionScope.Dispose()

我做错了什么吗? TransactionScope 类只能用于数据库相关代码吗?

我实际需要的是某种必须为代码块执行设置超时的机制。我找到了几个链接:

How to set timeout for a line of c# code

Set timeout to an operation

Implement C# Generic Timeout

它们似乎都在单独的线程中执行需要代码的超时,并在发生超时时中止该线程。但是我认为这是困惑的,我不希望这样,因为线程创建的成本和线程中止的问题如下所述:

http://blogs.msmvps.com/peterritchie/2007/08/22/thead-abort-is-a-sign-of-a-poorly-designed-program/

我以为我可以使用事务作用域使任何代码块超时,但它的行为并非如此。

为代码块执行设置时间限制的最佳解决方案是什么?

最佳答案

据我所知,除非专门编写代码块以知道它可能会超时(例如,它是一个循环检查耗时并在必要时终止),否则没有办法在不中止操作的情况下使操作超时线。正如您所指出的那样,这很困惑。如果代码块限制允许这样做(无状态),我可能会启动一个单独的进程(有一个池供我使用,因为这比创建线程要昂贵得多)以确保代码块不会影响任何东西,并在那里运行代码。如果代码不会及时返回,则终止进程。沿着这条路,你必须想出一种调用代码、程序集解析等的方法。可能,使用一些沙盒解决方案......(可能使用 AppDomains 而不是进程,但如果事情往南)。

我认为 TransactionScope 不适合担任此类工作。

关于c# - 使用 TransactionScope 使常规(非数据库相关)c# 代码超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27171577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com