Мои рабочие процессы размещены в IIS. и каждый рабочий процесс наследуется от asynccodeactivity. В BeginExecute я вызываю команду.Beginxxx и в конце выполняю вызов EndExecutexxx. Я использую блок доступа к базе данных (DAAB).операции async DB
protected override IAsyncResult BeginExecute(AsyncCodeActivityContext context, AsyncCallback callback, object state)
{
DbCommand command = null;
DbConnection dbConnection = null;
entlib.Database database;
try
{
database = EnterpriseLibraryContainer.Current.GetInstance<entlib.Database>(DatabaseName.Get(context));
dbConnection = database.CreateConnection();
command = dbConnection.CreateCommand();
command.CommandText = CommandText.Get(context);
command.CommandType = CommandType.Get(context);
//have removed few assignments here
context.UserState = new AsyncDbState(database, command);
}
catch (Exception e)
{
if (command != null)
command.Dispose();
if (dbConnection != null)
dbConnection.Dispose();
throw e;
}
return (database.Beginxxx(command, callback, state));
}
protected override TResult EndExecute(AsyncCodeActivityContext context, IAsyncResult iResult)
{
TResult result = default(TResult);
var userState = context.UserState as AsyncDbState;
try
{
result = (TResult)userState.Database.Endxxx(iResult);
}
finally
{
if (null != userState && null != userState.Command)
userState.Command.Dispose();
}
return result;
}
И спорадически он выдает ошибку в журнале событий и завершает весь пул приложений. После того, как Комментарии по @Will, я сделал ловушку внутреннее исключение и заметил фактическая ошибка
сложилось,в BeginExecute из различной активности, который наследует от asyncnativeactivity, у меня
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);
}
Необработанное исключение и процесс был прекращен.
Произошло необработанное исключение, и процесс был прерван.
ID приложения:/LM/W3SVC/1/ROOT/workflowservice
Идентификатор процесса: 7140
Исключение: System.AggregateException
Сообщение: исключение (ы) задача не наблюдалось ни путем ожидания заданий или доступа к свойству Exception. В результате незаметное исключение было восстановлено потоком финализатора.
StackTrace: в System.Threading.Tasks.TaskExceptionHolder.Finalize()
InnerException: Microsoft.AnalysisServices.AdomdClient.AdomdErrorResponseException
Сообщения: Сервер: текущая операция была отменена, потому что другая операция в транзакции не смогли.
StackTrace: в Microsoft.AnalysisServices.AdomdClient.AdomdConnection.XmlaClientProvider.Microsoft.AnalysisServices.AdomdClient.IExecuteProvider.ExecuteTabular (поведение CommandBehavior, ICommandContentProvider ContentProvider, AdomdPropertyCollection commandProperties, параметры IDataParameterCollection) в Microsoft.AnalysisServices.AdomdClient.AdomdCommand.ExecuteReader (поведение CommandBehavior) в WorkflowActivity.AsyncExecuteSafeReader.ExecuteMdxQuery (String connectionStringName, струнного mdxQuery, Nullable 1 commandTimeout, CancellationToken cancellationToken) in d:\B\69\Sources\Infrastructure\WorkflowActivity\AsyncExecuteSafeReader.cs:line 222 at AsyncExecuteSafeReader.ExecuteMdxQuery(String connectionStringName, String mdxQuery, Nullable
1 CommandTimeout, CancellationToken CancellationToken) в D: \ в \ 69 \ Источники \ Инфраструктура \ WorkflowActivity \ AsyncExecuteSafeReader.cs: строка 239 в WorkflowActivity. AsyncExecuteSafeReader. <> c__DisplayClassd.b__a() in d: \ B \ 69 \ Sources \ Infrastructure \ WorkflowActivity \ AsyncExecuteSafeReader.cs: строка 180 в System.Threading.Tasks.Task`1.InvokeFuture (Object futureAsObj) в System.Threading. Tasks.Task.Execute()
Вы используете небезопасный код на разных потоках.Я подозреваю, что он сосредоточен здесь «EnterpriseLibraryContainer.Current.GetInstance», если он не хранит экземпляр для каждой нити. Вам нужно будет проверить код или документы. Во всяком случае, в рамках метода вы должны использовать только «новые» экземпляры, а не переменные класса. – Will
Спасибо. Я проверю, что происходит. но в beginexecute я использую новые экземпляры переменных правильно? или я не понимаю? dbcommand, соединения и объекты базы данных? – KaSh
Пока вы используете ключевое слово 'new', да. – Will