0

我有一些非常基本的代码,它接受一个字符串列表,并为每个字符串创建一个新线程。

然后线程写入一个以字符串命名的文件,因此应该是唯一的,但我遇到访问冲突。

我尝试了 VS 2010 中的调试器选项,当我单步执行时它没有给我文件访问问题,但它每个循环写入两行,所以我假设它仍然存在两次运行线程的问题

调用线程的代码:

For Each x In x_list
  Dim trd as new Thread(DirectCast(Sub() tp(x), ThreadStart))
Next

线程代码:

Private Sub tp(ByVal x_in As String)
  Dim res_file As New StreamWriter("C:\result_" + x_in + ".txt", True)
  For i = 1 to 5
    res_file.WriteLine(DateTime.Now.ToString)
  Next
  res_file.Close()
End Sub
4

1 回答 1

1

您在这里引入了一个不必要的Lambda

Sub() tp(x)

然后你遇到了来自 C# 的同一个众所周知的问题——你正在捕获的是不断变化的变量,直到它被设置为循环中的最后一个值。1

尝试一下:

For Each x In x_list
  Dim trd as new Thread(DirectCast(tp, ParameterizedThreadStart))
  trd.Start(x)
  'TODO - Does trd get stored anywhere?
Next

1参见例如关闭被认为有害的循环变量,其中讨论了 C#5 的变化,但我认为 VB.Net 没有相应的变化。

于 2013-07-10T12:34:43.813 回答