簡體   English   中英

如何使用Delphi和OmniThread將文件上傳到背景中?

[英]How upload files to azure in background with Delphi and OmniThread?

我試圖用Delphi將+100文件上傳到azure。 但是,調用會阻塞主線程,因此我想通過異步調用或后台線程來執行此操作。

這就是我現在所做的事情(如此處所述 ):

procedure TCloudManager.UploadTask(const input: TOmniValue;
  var output: TOmniValue);
var
  FileTask:TFileTask;
begin
  FileTask := input.AsRecord<TFileTask>;

  Upload(FileTask.BaseFolder, FileTask.LocalFile, FileTask.CloudFile);
end;

function TCloudManager.MassiveUpload(const BaseFolder: String;
  Files: TDictionary<String, String>): TStringList;
var
  pipeline: IOmniPipeline;
  FileInfo : TPair<String,String>;
  FileTask:TFileTask;
begin
  // set up pipeline
  pipeline := Parallel.Pipeline
    .Stage(UploadTask)
    .NumTasks(Environment.Process.Affinity.Count * 2)
    .Run;
  // insert URLs to be retrieved
  for FileInfo in Files do
  begin
    FileTask.LocalFile := FileInfo.Key;
    FileTask.CloudFile := FileInfo.Value;
    FileTask.BaseFolder := BaseFolder;

    pipeline.Input.Add(TOmniValue.FromRecord(FileTask));
  end;//for

  pipeline.Input.CompleteAdding;

  // wait for pipeline to complete
  pipeline.WaitFor(INFINITE);
end;

不過這塊也是(為什么?我不明白)。

這會阻塞,因為您正在調用WaitFor,等待所有管道階段完成其工作。 在等待期間,GUI被阻止。

一個正確的方法是

  1. 將Parallel.Pipeline中返回的存儲接口存儲在全局存儲中(例如,在TCloudManager字段中)。
  2. 安排管道工作。
  3. 不要等待結束,而是分配OnStop處理程序並執行此處所需的任何清理(不要忘記忽略保存管道接口的全局存儲)。

要執行第3步,您需要從SVN獲取新的OmniThreadLibrary,因為我剛剛添加了此功能:)

procedure TCloudManager.MassiveUpload(const BaseFolder: String;
  Files: TDictionary<String, String>);
var
  FileInfo : TPair<String,String>;
  FileTask:TFileTask;
begin
  // set up pipeline
  FPipeline := Parallel.Pipeline
    .Stage(UploadTask)
      .NumTasks(Environment.Process.Affinity.Count * 2)
    .OnStop(
      procedure begin
        ShowMessage('All done');
        FPipeline := nil;
      end)
    .Run;
//   insert URLs to be retrieved
  for FileInfo in Files do
  begin
    FileTask.LocalFile := FileInfo.Key;
    FileTask.CloudFile := FileInfo.Value;
    FileTask.BaseFolder := BaseFolder;

    FPipeline.Input.Add(TOmniValue.FromRecord(FileTask));
  end;//for
  FPipeline.Input.CompleteAdding;
end;

Delphi有一個.NET變體,對吧? 您是否知道Azure存儲服務有一個.NET托管API?

CloudBlockBlob類具有用於上載/下載等的異步變體。

http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.storageclient.cloudblockblob_methods.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM