Основы задач: задачи против нескольких экземпляров приложения - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть устаревшее приложение, которое внезапно стало важным.Это должно быть быстрее.Существует множество фрагментов кода, которые могут быть использованы для параллельной обработки, например, распаковка больших файлов и загрузка нескольких файлов вместо одного за раз.Он также обрабатывает файлы данных, и я думаю, что это может быть сделано с потоком на файл, но у меня были проблемы с этим.

Я вижу два возможных решения.

Решение 1) Создайте задачу для каждого _файла в FilesToProcess и используйте Task.Run (Tasks.ToArray ()).

Решение 2) Добавьте дескриптор к основному приложению, в котором указан параметр строки, и передайте _fileToProcess.Затем обработайте файл как обычно.При таком подходе я просто запускаю новый процесс существующего приложения для обработки одного файла, но я запускаю столько, сколько мне нужно.

Мой код не является потокобезопасным.Должен ли я действительно переписать код, чтобы все мои подпроцессы были синхронизированы или находились в любой проблемной области IE 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 голосов
/ 06 февраля 2019

Я бы предпочел Решение 1) ЕСЛИ вы можете выделить экземпляры, чтобы сделать его потокобезопасным.

Это означает что-то вроде

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, то вы получите его поточно-ориентированным.

...