C# 使用线程并行调用两个方法-一个在一个完成之前执行

C# 使用线程并行调用两个方法-一个在一个完成之前执行,c#,asp.net,multithreading,parallel-processing,backgroundworker,C#,Asp.net,Multithreading,Parallel Processing,Backgroundworker,我在C应用程序中使用多线程上传图像 流程是,首先我要调整图像的大小。 第二,我上传他们 代码如下: 上传按钮点击 private void Button_Click_1(object sender, RoutedEventArgs e) { ResizeImagesAtLocal(); UploadImageToCloud(); } private void ResizeImagesAtLocal() {

我在C应用程序中使用多线程上传图像

流程是,首先我要调整图像的大小。 第二,我上传他们

代码如下:

上传按钮点击

private void Button_Click_1(object sender, RoutedEventArgs e)
{
            ResizeImagesAtLocal();
            UploadImageToCloud();
}               


private void ResizeImagesAtLocal()
{
            var worker = new BackgroundWorker
                {
                    WorkerReportsProgress = true
                };

            worker.DoWork += worker_ResizeImages;
            worker.ProgressChanged += worker_ResizeProgressChanged;

            worker.RunWorkerAsync();
}

private void worker_ResizeProgressChanged(object sender, ProgressChangedEventArgs e)
{
   ResizeProgress.Value = e.ProgressPercentage;
}

private void worker_ResizeImages(object sender, DoWorkEventArgs e)
{
    ...
}


private void UploadImageToCloud()
{
            var worker = new BackgroundWorker();
            worker.WorkerReportsProgress = true;
            worker.DoWork += worker_UploadImages;
            worker.ProgressChanged += worker_UploadProgressChanged;

            worker.RunWorkerAsync();
}

void worker_UploadProgressChanged(object sender, ProgressChangedEventArgs e)
{
    UploadProgress.Value = e.ProgressPercentage;
}

void worker_UploadImages(object sender, DoWorkEventArgs e)
{
  ...
}
问题是,ResizeImagesAtLocal尚未完成,上载映像已开始执行,这导致了问题

有没有办法确保。。ResizeImagesAtLocal完成了它的所有工作,然后我们可以调用upload方法

您可以使用4.0版的present

您可以执行以下操作:

Task.Factory.StartNew(()=> {
}). ContinuewWith(...);

ContinueWith将在开始新任务完成后调用

如果您喜欢使用Microsoft的反应式框架,可以使用以下方法:

Func<Image, Image> resizeImage = i => { /* resize image */ };
Func<Image, System.Uri, bool> uploadImage = (i, u) => { /* upload image */ };
var uri = /* upload uri */;

var query =
    from image in images.Select((x, n) => new { x, n }).ToObservable()
    from thumbnail in Observable.Start(() => resizeImage(image.x))
    from uploaded in Observable.Start(() => uploadImage(thumbnail, uri))
    select new
    {
        image = image.x,
        index = image.n,
        thumbnail,
        uploaded,
    };

query
    .ObserveOn(SynchronizationContext.Current)
    .Subscribe(x =>
    {
        UploadProgress.Value = x.index * 100 / images.Count();
        /* do other stuff if needed on UI thread */
    });

就这样。所有这些都是在后台线程上并行处理的。它将更新封送到UI线程。Subscribe方法返回可用于停止后台线程的IDispose。所有这些都可以在单击事件处理程序中进行编码。

提示,使用C5异步等待。第二个提示。为什么第二个任务必须依靠第二个工人来完成?只要把它们都放在同一个worker中,你就知道它们将按顺序运行。我设计的过程是这样的。所有图像都将调整大小并存储在本地文件夹中。然后将它们上传..两者都将显示进度..因此它们需要在不同的线程中..您正在将所有大小调整与所有上载并行化,您应该将单个同步大小调整与上载对从C4角度进行并行化,我完全同意@cellik。然而,从C5开始,我建议使用TPL数据流或Rx.Net。这在任何一种技术中都很简单,而在BackgroundWorker中也很愚蠢。如果不使用这种方法,我怎么能不阻止UI线程以同步方式显示调整大小的过程。@Akon,您可以在C5中以5>4的方式进行。尽管我建议使用Task.Run,如果您有C5。