5

我曾尝试使用 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;

但是这个块也是(为什么?我不明白)。

4

2 回答 2

4

这会阻塞,因为您正在调用 WaitFor 等待所有管道阶段完成它们的工作。在等待期间,GUI 被阻塞。

一个正确的方法是

  1. 将 Parallel.Pipeline 返回的接口存储在全局存储中(例如在 TCloudManager 字段中)。
  2. 将工作安排到管道。
  3. 不要 WaitFor 结束,而是分配 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;
于 2012-03-26T06:03:46.530 回答
-5

Delphi 有一个 .NET 变体,对吗?您是否知道 Azure 存储服务有一个 .NET 托管 API?

CloudBlockBlob 类具有用于上传/下载等的异步变体。

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

于 2012-03-25T21:09:50.873 回答