C# 自定义任务运行程序方法引发ArgumentException

C# 自定义任务运行程序方法引发ArgumentException,c#,task-parallel-library,argumentexception,C#,Task Parallel Library,Argumentexception,由于CultureInfo并没有从一个线程复制到另一个线程,所以我使用以下方法来完成这项工作 public static StartCustomTask(Action action, TaskCreationOptions tco = TaskCreationOptions.None) { var currentCult = Thread.CurrentThread.CurrentCuture; var currentUiCult = Thread.CurrentThread.C

由于CultureInfo并没有从一个线程复制到另一个线程,所以我使用以下方法来完成这项工作

public static StartCustomTask(Action action, TaskCreationOptions tco = TaskCreationOptions.None)
{
    var currentCult = Thread.CurrentThread.CurrentCuture;
    var currentUiCult = Thread.CurrentThread.CurrentUICulture;

    return Task.Factory.StartNew(() =>
    {
        Thread.CurrentThread.CurrentCuture = currentCult;
        Thread.CurrentThread.CurrentUICulture = currentUiCult;
        action();
    }, tco);
}
基本上,这段代码将区域性信息从当前线程复制到要执行
操作的线程。我不知道为什么,但它抛出
系统。ArgumentException
表示
值不在预期范围内。我试着在主线程上定期运行动作本身,它运行得非常完美。我的意思是,作为一个动作的方法本身没有问题,我想上面的代码中有一个问题

下面是异常的堆栈跟踪

at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo)
   at System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal(String name)
   at System.Web.HttpRequest.BuildUrl(Func`1 pathAccessor)
   at System.Web.HttpRequest.get_Url()
   at SL.CoreLogic.Web.FrontEnd.Controllers.AccountController.<>c__DisplayClass37.<ResetPassword>b__31() in d:\CoreProjects\CoreLogic\CoreLogic-RusSlot\SL.CoreLogic\SL.CoreLogic.Web.FrontEnd\Controllers\AccountController.cs:line 447
   at SL.CoreLogic.Common.CustomTask.<>c__DisplayClass1.<StartWithCurrentCulture>b__0() in d:\CoreProjects\CoreLogic\CoreLogic-RusSlot\SL.CoreLogic\SL.CoreLogic.Common\CustomTask.cs:line 22
   at System.Threading.Tasks.Task.
在System.Runtime.InteropServices.Marshall.ThroweExceptionForhr内部(Int32 errorCode,IntPtr errorInfo)
位于System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal(字符串名称)
位于System.Web.HttpRequest.BuildUrl(Func`1路径访问器)
在System.Web.HttpRequest.get_Url()上
在SL.CoreLogic.Web.FrontEnd.Controllers.AccountController.c__中,在d:\CoreProjects\CoreLogic\CoreLogic RusSlot\SL.CoreLogic\SL.CoreLogic.Web.FrontEnd\Controllers\AccountController.cs中显示class37.b__31():第447行
在d:\CoreProjects\CoreLogic\CoreLogic RusSlot\SL.CoreLogic\SL.CoreLogic.Common.CustomTask.c__中显示Class1.b_0(),第22行
在System.Threading.Tasks.Task。

还有一件事。这段代码运行得很好,但突然它开始这样做了。

我明白了。问题是,该操作包含如下Url=Request.Url这样的行,我猜在执行代码时,请求对象不存在或未设置。

我看不出问题,它对我有效。您要传递的操作中有什么?它是一个类型为action()=>doThing(新Obj{//configure properties})的匿名方法,如果我只运行这个doThing(新Obj{//configure properties}),它看起来是这样的)它可以正常工作,但是如果我把这个作为一个动作传递给那个方法,它就会开始做这个奇怪的事情,错误发生在哪一行?在包含这个语句()的行上(=>doThing(newobj{//configure properties}))