Monday, 15 March 2010

c# - how to wait for all AsyncCallback to return in asp.net -



c# - how to wait for all AsyncCallback to return in asp.net -

i'm using multi-threaded database query retrieve several info tables @ once. i've used list locked...and 1 time callbacks returned, want homecoming list. want know how wait callbacks finish.

private object tablelock = new object(); private list<datatable> tables_from_callback = new list<datatable>(); private void execreaderhandlecallback(iasyncresult result) { sqlcommand command = (sqlcommand)result.asyncstate; sqldatareader reader = command.endexecutereader(result); datatable dt = new datatable(); dt.load(reader); lock (tablelock) { tables_from_callback.add(dt); } } public list<datatable> begexecreader(string query, int query) { conn = new sqlconnection(connectionstring); seek { conn.open(); waithandle[] waithandles = new waithandle[query]; iasyncresult[] results = new iasyncresult[query]; sqlcommand[] cmds = new sqlcommand[query]; (int = 0; < query; i++ ) { sqlcommand cmd = new sqlcommand(); cmd.connection = conn; cmd.commandtext = query; cmd.commandtype = commandtype.text; cmd.commandtimeout = querytimeout; asynccallback callback = new asynccallback(execreaderhandlecallback); cmd.beginexecutereader(callback, cmd); cmds[i] = cmd; } /* ???? here need wait callbacks finish how? ??????? */ homecoming tables_from_callback; } { conn.close(); } }

i've done similar without using callbacks where

iasyncresult result = cmd.beginexecutereader(); results[i] = result; waithandles[i] = result.asyncwaithandle; ... waithandle.waitall(waithandles);

but must utilize callback not have wait handles. help appreciated.

a cheesy way utilize variable both contexts have access to. context, mean caller passes callback , callback itself.

static void main(string[] args) { int x = 1; task.run(() => { thread.sleep(5000); console.writeline("yay!"); x = 0; }); while (x != 0) { thread.yield(); } console.writeline("done"); console.readkey(true); }

i'm using task.run simulate callback situation; however, principle still applies in case of callback...the difference utilize class-level variable or (yikes) static variable. semaphore long semaphore not signaled right away...like this.

static void main(string[] args) { semaphore s = new semaphore(1, 2); task.run(() => { s.waitone(); thread.sleep(5000); console.writeline("yay!"); s.release(); }); thread.sleep(100); s.waitone(); console.writeline("done"); console.readkey(true); }

c# asp.net asynccallback

No comments:

Post a Comment