c# - Using BeginExecuteNonQuery with async tasks -
i'm working on adding methods base repository handle other code process queries use async tasks. wraping task around existing beginexecutenonquery , endexecutenonquery methods.
are there pitfalls of using method this? correct catch exceptions happened during execution of sql statement in asynccallback?
public class repo { public class sqlcommandasyncstate<t> { public sqlcommand sqlcommand { get; set; } public taskcompletionsource<t> taskcompletionsource { get; set; } public sqlcommandasyncstate() { taskcompletionsource = new taskcompletionsource<t>(); } } private int? sqlcommand_endexecutenonquery(sqlcommand sqlcommand, iasyncresult result) { try { return sqlcommand.endexecutenonquery(result); } catch (exception ex) { // logerror(logimportance.fatal, ex); } { sqlcommand.connection.dispose(); } return null; } private void sqlcommand_executenonqueryforintcompleted(iasyncresult result) { sqlcommandasyncstate<int?> state = result.asyncstate sqlcommandasyncstate<int?>; state.taskcompletionsource.setresult(sqlcommand_endexecutenonquery(state.sqlcommand, result)); } private void sqlcommand_executenonqueryforboolcompleted(iasyncresult result) { sqlcommandasyncstate<bool?> state = result.asyncstate sqlcommandasyncstate<bool?>; int? rowsaffected = sqlcommand_endexecutenonquery(state.sqlcommand, result); state.taskcompletionsource.setresult(rowsaffected.hasvalue ? (bool?)(rowsaffected.value > 0) : null); } public async task<bool?> updateasync(string commandtext, sqlparameter[] parameters) { sqlcommandasyncstate<bool?> state = new sqlcommandasyncstate<bool?>(); sqlconnection sql_connection = new sqlconnection(connectionstring); try { sql_connection.open(); state.sqlcommand = new sqlcommand(commandtext, sql_connection); state.sqlcommand.commandtype = commandtype.storedprocedure; state.sqlcommand.parameters.addrange(parameters); state.sqlcommand.beginexecutenonquery(new asynccallback(sqlcommand_executenonqueryforboolcompleted), state); } catch (exception ex) { // logerror(logimportance.fatal, ex); state.taskcompletionsource.setresult(null); } return await state.taskcompletionsource.task; } public async task<int?> updatewithcountasync(string commandtext, sqlparameter[] parameters) { sqlcommandasyncstate<int?> state = new sqlcommandasyncstate<int?>(); sqlconnection sql_connection = new sqlconnection(connectionstring); try { sql_connection.open(); state.sqlcommand = new sqlcommand(commandtext, sql_connection); state.sqlcommand.commandtype = commandtype.storedprocedure; state.sqlcommand.parameters.addrange(parameters); state.sqlcommand.beginexecutenonquery(new asynccallback(sqlcommand_executenonqueryforintcompleted), state); } catch (exception ex) { // logerror(logimportance.fatal, ex); state.taskcompletionsource.setresult(null); } return await state.taskcompletionsource.task; } }
task.factory.fromasync designed that.
Comments
Post a Comment