Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

マルチスレッドでのデータテーブルの操作

60 views
Skip to first unread message

BBC

unread,
Jan 13, 2009, 4:14:07 AM1/13/09
to
こんにちは。
環境はWinXP(SP3)+VS2003(SP1)+.Net Framework1.1(SP1)です。

マルチスレッドでのデータテーブルの操作を試みたところ

System.NullReferenceException
System.Data.ConstraintException
System.ArgumentOutOfRangeException

といったエラーがランダムに発生します。
(それぞれのエラーの意味はわかります。)

大雑把なコードは以下のようになっています。
-------------------- ここから --------------------
Private Shared dt As DataTable

Private Sub InitTable()

dt = New DataTable

Dim dc(1) As DataColumn
Dim pk(0) As DataColumn

dc(0) = New DataColumn
dc(0).DataType = GetType(String)

dc(1) = New DataColumn
dc(0).DataType = GetType(Integer)

pk(0) = dc(0)
dt.PrimaryKey = pk

End Sub

Private Sub Execute()

For Each r As DataRow In dt.Rows
Threading.ThreadPool.QueueUserWorkItem _
(New System.Threading.WaitCallback _
(AddressOf UpdateData), _
New UpdateTarget(Convert.ToString(r(0)))
Next

End Sub

Private Shared Sub UpdateData(ByVal obj As Object)

Dim Key As UpdateTarget = CType(obj, UpdateTarget)
Dim r As DataRow = dt.Rows.Find(Key)

  '---------- この間でエラーとなる ----------
r.BeginEdit()
r(1) = Convert.ToInt32(r(1))+1
r.EndEdit()
'------------------------------------------

End Sub

Public Class UpdateTarget

Dim _Key As String

Public Property Key() As String
Get
Return _Key
End Get
Set(ByVal Value As String)
_Key = Value
End Set
End Property

Public Sub New(ByVal Key As String)
_Key = Key
End Sub

End Class
-------------------- ここまで --------------------

どのあたりがマズいのかご指摘いただければ幸いです。
よろしくお願いします。

BBC

unread,
Jan 15, 2009, 4:43:29 AM1/15/09
to
DataRowクラスのヘルプに
> この型は、マルチスレッド読み取り操作に対して安全です。すべての書き込み操作の同期をとる必要があります。
とありました。

>読み取り操作に対して
を読み落としとしていました。
SyncLockあたりを勉強して出直します。
お騒がせしました。

0 new messages