vb.net - How to make SqlDataReader thread safe / convert to thread safe type -
i dealing legacy applcation written in vb.net. have been tasked use paralel task library , thread application. bulk of "work" in 1 while loop centers around sqldatareader object. credit of developer broken logical methods , 1 real work method. major problem of methods handle individual tasks accept sqldatareader parameter. know sqldatareader isn't thread safe , in way being used not thread safe @ all. want think convert sqldatareader concurrentqueue or ienumerable , have "work" thread , work on data in collection:
using command new sqlcommand(storedprocedure, connection) command.commandtype = commandtype.storedprocedure command.commandtimeout = 0 command.parameters.add("@carrier", sqldbtype.varchar, 50).value = scarrier using reader sqldatareader = command.executereader if reader.hasrows = true setreaderordinals(reader) adjustments = new stringbuilder 'todo appears bulk of work in application while reader.read adjustments.clear() commitcount += 1 if reader.isdbnull(somevalue) = false select case stuff case 1 dothingforone(reader) case 2 dothingfortwo(reader) case 3 dothingforthree(reader) case 4 dothingforfour(reader) case 5 dothingforfive(reader) case 6 dothingforsix(reader) case else 'log exit while end select else 'we failed end if end while
inside methods rdr acted upon in methods ex:
if rdr.getstring(somevalue).trim.length >= 5 if rrd.isdbnull(somevalue) rrd.getint32(somevalue)
what like:
'i know isn't how convert not sure how dim rows ienumerable(of myobject) = reader 'create threads , spawn them here 'act upon collection here in many threads parallel.for each row in rows 'do row stuff here if row not nothing select case stuff case 1 dothingforone(row) case 2 dothingfortwo(row) case 3 dothingforthree(row) case 4 dothingforfour(row) case 5 dothingforfive(row) case 6 dothingforsix(row) case else 'log exit end select else 'we failed end if end
i not sure if plausible or best way handle this, first thing came mind.
any suggestions?
if put database reader code iterator function, give way convert ienumerable
, e.g.
iterator function readmyobjects() ienumerable(of myobject) using cn = new sqlconnection("...") cn.open() using cmd = new sqlcommand("...", cn) using rdr = cmd.executereader() if rdr.hasrows while rdr.read() yield new myobject() { .propa = rdr.getstring(rdr.getordinal("a")) } end while end if end using end using end using end function
you can use in parallel loop:
parallel.foreach( readmyobjects(), sub(item myobject) ' item end sub )
Comments
Post a Comment