Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步数据库操作_C#_Asynchronous_Workflow Foundation 4_Enterprise Library - Fatal编程技术网

C# 异步数据库操作

C# 异步数据库操作,c#,asynchronous,workflow-foundation-4,enterprise-library,C#,Asynchronous,Workflow Foundation 4,Enterprise Library,我的工作流托管在IIS中。每个工作流都继承自asynccodeactivity。在BeginExecute中,我调用command.Beginxxx,在execute中,我调用EndExecutexxx。我正在使用数据库访问块(DAAB) 受保护的覆盖IAsyncResult BeginExecute(AsyncCodeActivityContext上下文、AsyncCallback回调、对象状态) { DbCommand=null; DbConnection-DbConnection=null

我的工作流托管在IIS中。每个工作流都继承自asynccodeactivity。在BeginExecute中,我调用command.Beginxxx,在execute中,我调用EndExecutexxx。我正在使用数据库访问块(DAAB)

受保护的覆盖IAsyncResult BeginExecute(AsyncCodeActivityContext上下文、AsyncCallback回调、对象状态)
{
DbCommand=null;
DbConnection-DbConnection=null;
数据库;
尝试
{
database=EnterpriseLibraryContainer.Current.GetInstance(DatabaseName.Get(上下文));
dbConnection=database.CreateConnection();
command=dbConnection.CreateCommand();
command.CommandText=CommandText.Get(上下文);
command.CommandType=CommandType.Get(上下文);
//我在这里删除了一些作业
context.UserState=新的AsyncDbState(数据库,命令);
}
捕获(例外e)
{
if(命令!=null)
command.Dispose();
if(dbConnection!=null)
dbConnection.Dispose();
投掷e;
}
返回(database.Beginxxx(命令、回调、状态));
}
受保护的覆盖TResult EndExecute(AsyncCodeActivityContext上下文,IAsyncResult iResult)
{
TResult结果=默认值(TResult);
var userState=context.userState作为AsyncDbState;
尝试
{
结果=(TResult)userState.Database.Endxxx(iResult);
}
最后
{
if(null!=userState&&null!=userState.Command)
userState.Command.Dispose();
}
返回结果;
}
它偶尔会在事件日志中抛出错误,并终止整个应用程序池。 在@Will的评论之后,我确实捕获了内部异常,并注意到实际的错误发生了

在继承自asyncnativeactivity的另一个活动的BeginExecute中,我有

 var task = AsyncFactory<IDataReader>.Action(() => ExecuteMdxQuery(connectionStringSettings, mdxQuery, commandTimeout, cancellationToken), cancellationToken);                        

                    return AsyncFactory<IDataReader>.ToBegin(task, callback, state);

and AsyncFactory looks like this 

 public static Task<TResult> Action(Func<TResult> actionMethod,CancellationToken token)
    {
        TaskFactory factory = new TaskFactory();
        //TaskFactory factory = new TaskFactory(scheduler);
        return factory.StartNew<TResult>(() => actionMethod(), token);   
        }
  public static IAsyncResult ToBegin(Task<TResult> task, AsyncCallback callback, object state)
    {
        var tcs = new TaskCompletionSource<TResult>(state);
        var continuationTask = task.ContinueWith(t =>
        {
            if (task.IsFaulted)
            {
                tcs.TrySetException(task.Exception.InnerExceptions);
            }
            else if (task.IsCanceled)
            {
                tcs.TrySetCanceled();
            }
            else
            {
                tcs.TrySetResult(task.Result);
            }
var task=AsyncFactory.Action(()=>ExecuteMdxQuery(ConnectionString设置、mdxQuery、commandTimeout、cancellationToken)、cancellationToken);
返回AsyncFactory.ToBegin(任务、回调、状态);
工厂看起来是这样的
公共静态任务操作(Func actionMethod、CancellationToken令牌)
{
TaskFactory工厂=新的TaskFactory();
//TaskFactory=新的TaskFactory(调度程序);
返回factory.StartNew(()=>actionMethod(),令牌);
}
公共静态IAsyncResult ToBegin(任务任务、异步回调、对象状态)
{
var tcs=新任务完成源(状态);
var continuationTask=task.ContinueWith(t=>
{
if(task.IsFaulted)
{
TrySetException(task.Exception.innerException);
}
else if(task.IsCanceled)
{
tcs.trysetconceled();
}
其他的
{
tcs.TrySetResult(task.Result);
}
发生未处理的异常,进程终止

发生未处理的异常,进程终止

应用程序ID:/LM/W3SVC/1/ROOT/workflowservice

进程ID:7140

异常:System.AggregateException

消息:通过等待任务或访问其exception属性,未观察到任务的异常。因此,终结器线程重新捕获了未观察到的异常

StackTrace:at System.Threading.Tasks.TaskExceptionHolder.Finalize()

InnerException:Microsoft.AnalysisServices.AdomdClient.AdomdErrorResponseException

消息:服务器:当前操作已取消,因为事务中的另一个操作失败

StackTrace:位于Microsoft.AnalysisServices.AdomdClient.AdomdConnection.XmlaClientProvider.Microsoft.AnalysisServices.AdomdClient.IExecuteProvider.ExecuteTaular(命令行为、ICommandContentProvider contentProvider、AdomdPropertyCollection命令属性、IDataParameterCollection参数) 位于Microsoft.AnalysisServices.AdomdClient.AdomdCommand.ExecuteReader(命令行为) 在d:\B\69\Sources\Infrastructure\WorkflowActivity\AsyncExecuteSaferader.ExecuteMdxQuery(字符串连接字符串名称,字符串mdxQuery,Nullable
1命令超时,CancellationToken CancellationToken)中的WorkflowActivity.AsyncExecuteSaferader.cs:第222行
在d:\B\69\Sources\Infrastructure\WorkflowActivity\AsyncExecuteSaferader.cs中的AsyncExecuteSaferader.ExecuteMdxQuery(字符串连接字符串名称,字符串mdxQuery,Nullable
1命令超时,取消令牌取消令牌):第239行 在d:\b\69\Sources\Infrastructure\WorkflowActivity\AsyncExecuteSaferader.c\u中显示ClassD.b\u a(),位于d:\b\69\Sources\Infrastructure\WorkflowActivity\AsyncExecuteSaferader.cs:第180行 位于System.Threading.Tasks.Task`1.InvokeFuture(对象futureAsObj)
在System.Threading.Tasks.Task.Execute()

IIS中的每个请求都由一个不同的线程提供服务。任何共享实例都将被多个线程命中。如果您没有预料到,这通常是个坏消息

因此,我的第一个猜测(不得不猜测,因为您的异常的调用堆栈被切断;稍后将对此进行详细说明)是因为您在不同线程之间使用了线程不安全的代码。我怀疑它集中在这里
EnterpriseLibraryContainer.Current.GetInstance
,因为如果它没有在每个线程中存储实例,那么它将在线程之间共享同一个实例。您必须检查代码或文档。最简单的测试方法是使用在监视窗口中“生成对象ID”,然后在两个不同的范围内比较来自
EnterpriseLibraryContainer.Current.GetInstance
的结果
 var task = AsyncFactory<IDataReader>.Action(() => ExecuteMdxQuery(connectionStringSettings, mdxQuery, commandTimeout, cancellationToken), cancellationToken);                        

                    return AsyncFactory<IDataReader>.ToBegin(task, callback, state);

and AsyncFactory looks like this 

 public static Task<TResult> Action(Func<TResult> actionMethod,CancellationToken token)
    {
        TaskFactory factory = new TaskFactory();
        //TaskFactory factory = new TaskFactory(scheduler);
        return factory.StartNew<TResult>(() => actionMethod(), token);   
        }
  public static IAsyncResult ToBegin(Task<TResult> task, AsyncCallback callback, object state)
    {
        var tcs = new TaskCompletionSource<TResult>(state);
        var continuationTask = task.ContinueWith(t =>
        {
            if (task.IsFaulted)
            {
                tcs.TrySetException(task.Exception.InnerExceptions);
            }
            else if (task.IsCanceled)
            {
                tcs.TrySetCanceled();
            }
            else
            {
                tcs.TrySetResult(task.Result);
            }