我有一个突然重要的旧版应用程序。它需要更快。有许多代码可以并行处理,例如解压缩大文件并下载多个文件,而不是一次下载一个。它还处理数据文件,我认为可以通过每个文件一个线程来完成,但是我遇到了麻烦。
我看到两种可能的解决方案。
解决方案1)为FilesToProcess中的每个_file创建一个任务,并使用Task.Run(Tasks.ToArray())。
解决方案2)向使用字符串参数的主应用程序添加一个句柄,并传递_fileToProcess。然后正常处理文件。通过这种方法,我只是启动了现有应用程序的新进程来处理单个文件,但我会根据需要启动任意多个进程。
我的代码不是线程安全的。我真的需要重写代码以便所有子进程都被同步锁定或在任何问题区域I.E.上等待吗? MethodCall1通过byref?有没有更简单的解决方案?
如果是这样,即使没有透明性,解决方案2似乎也将是一种更简单的方法。
下面是现在如何编写的伪代码示例。
Public Sub Main()
Dim Foo, Bar
Dim FilesToProcess = DownloadFiles()
For Each _file as string in FilesToProcess
UnzipFile(_file)
MethodCall1(Foo,Bar)
MethodCall2SqlIdentityInsert()
MethodCall2SqlUpdate()
Next
End Sub
Public Sub MethodCall1(ByRef Foo, ByRef Bar)
Foo = Something
bar = SomethingElse
End Sub
伪代码Sol1
Public Sub Main()
Dim tasks As List(Of Task) = New List(Of Task)()
Dim FilesToProcess = DownloadFiles()
For Each _file as string in FilesToProcess
tasks.Add(Task.RunSub()
Dim Foo, Bar
UnzipFile(_file)
MethodCall1(Foo,Bar)
MethodCall2SqlIdentityInsert()
MethodCall2SqlUpdate()
End Sub)
Next
Task.WaitAll(tasks.ToArray())
End Sub
Public Sub MethodCall1(ByRef Foo, ByRef Bar)
Foo = Something
bar = SomethingElse
End Sub
答案 0 :(得分:1)
我希望使用解决方案1) IF ,您可以隔离实例以使其具有线程安全性。
这意味着类似
Public Class IsolatedWorker
private fFileName As String
Private fFoo, fBar As Object
Public Sub New(FileName)
fFileName=FileName
End New
Public Sub Process()
UnzipFile
MethodCall1()
MethodCall2SqlIdentityInsert()
MethodCall2SqlUpdate()
End Sub
Private sub UnzipFile()
End Sub
Private sub MethodCall1()
fFoo = Somehting
fBar = SomethingElse
End Sub
Private sub MethodCall2SqlIdentityInsert()
End Sub
Private sub MethodCall2SqlUpdate()
End Sub
End Class
如果您可以避免使用所有全局变量并将状态保持在IsolatedWorker中,那么它将获得线程安全性。