任务基础:任务与应用程序的多个实例

时间:2019-02-06 15:24:55

标签: vb.net synchronization task

我有一个突然重要的旧版应用程序。它需要更快。有许多代码可以并行处理,例如解压缩大文件并下载多个文件,而不是一次下载一个。它还处理数据文件,我认为可以通过每个文件一个线程来完成,但是我遇到了麻烦。

我看到两种可能的解决方案。

解决方案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

1 个答案:

答案 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中,那么它将获得线程安全性。