完整实例

  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;

    // Add a using directive and a reference for System.Net.Http.
    using System.Net.Http;

    // Add the following using directive.
    using System.Threading;

    namespace CancelAfterOneTask
    {
        public partial class MainWindow : Window
        {
            // Declare a System.Threading.CancellationTokenSource.
            CancellationTokenSource cts;

    public MainWindow()
            {
                InitializeComponent();
            }

    private async void startButton_Click(object sender, RoutedEventArgs e)
            {
                // Instantiate the CancellationTokenSource.
                cts = new CancellationTokenSource();

    resultsTextBox.Clear();

    try
                {
                    await AccessTheWebAsync(cts.Token);
                    resultsTextBox.Text += "\r\nDownload complete.";
                }
                catch (OperationCanceledException)
                {
                    resultsTextBox.Text += "\r\nDownload canceled.";
                }
                catch (Exception)
                {
                    resultsTextBox.Text += "\r\nDownload failed.";
                }

    // Set the CancellationTokenSource to null when the download is complete.
                cts = null;
            }

    // You can still include a Cancel button if you want to.
            private void cancelButton_Click(object sender, RoutedEventArgs e)
            {
                if (cts != null)
                {
                    cts.Cancel();
                }
            }

    // Provide a parameter for the CancellationToken.
            async Task AccessTheWebAsync(CancellationToken ct)
            {
                HttpClient client = new HttpClient();

    // Call SetUpURLList to make a list of web addresses.
                List<string> urlList = SetUpURLList();

    // ***Comment out or delete the loop.
                //foreach (var url in urlList)
                //{
                //    // GetAsync returns a Task<HttpResponseMessage>.
                //    // Argument ct carries the message if the Cancel button is chosen.
                //    // ***Note that the Cancel button can cancel all remaining downloads.
                //    HttpResponseMessage response = await client.GetAsync(url, ct);

    //    // Retrieve the website contents from the HttpResponseMessage.
                //    byte[] urlContents = await response.Content.ReadAsByteArrayAsync();

    //    resultsTextBox.Text +=
                //        String.Format("\r\nLength of the downloaded string: {0}.\r\n", urlContents.Length);
                //}

    // ***Create a query that, when executed, returns a collection of tasks.
                IEnumerable<Task<int>> downloadTasksQuery =
                    from url in urlList select ProcessURLAsync(url, client, ct);

    // ***Use ToArray to execute the query and start the download tasks.
                Task<int>[] downloadTasks = downloadTasksQuery.ToArray();

    // ***Call WhenAny and then await the result. The task that finishes
                // first is assigned to firstFinishedTask.
                Task<int> firstFinishedTask = await Task.WhenAny(downloadTasks);

    // ***Cancel the rest of the downloads. You just want the first one.
                cts.Cancel();

    // ***Await the first completed task and display the results.
                // Run the program several times to demonstrate that different
                // websites can finish first.
                var length = await firstFinishedTask;
                resultsTextBox.Text += String.Format("\r\nLength of the downloaded website:  {0}\r\n", length);
            }

    // ***Bundle the processing steps for a website into one async method.
            async Task<int> ProcessURLAsync(string url, HttpClient client, CancellationToken ct)
            {
                // GetAsync returns a Task<HttpResponseMessage>.
                HttpResponseMessage response = await client.GetAsync(url, ct);

    // Retrieve the website contents from the HttpResponseMessage.
                byte[] urlContents = await response.Content.ReadAsByteArrayAsync();

    return urlContents.Length;
            }

    // Add a method that creates a list of web addresses.
            private List<string> SetUpURLList()
            {
                List<string> urls = new List<string>
                {
                    "http://msdn.microsoft.com",
                    "http://msdn.microsoft.com/en-us/library/hh290138.aspx",
                    "http://msdn.microsoft.com/en-us/library/hh290140.aspx",
                    "http://msdn.microsoft.com/en-us/library/dd470362.aspx",
                    "http://msdn.microsoft.com/en-us/library/aa578028.aspx",
                    "http://msdn.microsoft.com/en-us/library/ms404677.aspx",
                    "http://msdn.microsoft.com/en-us/library/ff730837.aspx"
                };
                return urls;
            }
        }
        // Sample output:

    // Length of the downloaded website:  158856

    // Download complete.
    }

在完成一个异步任务后取消剩余任务(C#)的更多相关文章

  1. 如何设计一个异步Web服务——任务调度

    接上一篇<如何设计一个异步Web服务——接口部分> Application已经将任务信息发到了Service服务器中,接下来,Service服务器改如何对自身的资源进行合理分配以满足App ...

  2. 分享一个异步任务在遇到IO异常时支持递归回调的辅助方法

    public void TryAsyncActionRecursively<TAsyncResult>( string asyncActionName, Func<Task<T ...

  3. 深入理解Tornado——一个异步web服务器

    本人的第一次翻译,转载请注明出处:http://www.cnblogs.com/yiwenshengmei/archive/2011/06/08/understanding_tornado.html原 ...

  4. 一个异步任务接收两个url下载两个图片

    有两个url,一个是下载用户头像的url,一个是下载用户上传图片的url,想要用一个异步任务同时下载这两个图片. 程序的下载任务是这么执行的,先接受url参数,然后调用 imgUrls = infoP ...

  5. Netty实现的一个异步Socket代码

    本人写的一个使用Netty实现的一个异步Socket代码 package test.core.nio; import com.google.common.util.concurrent.ThreadF ...

  6. 并发编程 —— 自己写一个异步回调 API

    1. 前言 在并发编程中,异步回调的效率不言而喻,在业务开发中,如果由阻塞的任务需要执行,必然要使用异步线程.并且,如果我们想在异步执行之后,根据他的结果执行一些动作. JDK 8 之前的 Futur ...

  7. 如何设计一个异步Web服务——接口部分

    需求比较简单,提供一个异步Web服务供使用者调用.比如说,某应用程序需要批量地给图片加lomo效果.由于加lomo效果这个操作非常消耗CPU资源,所以我们需要把这个加lomo效果的程序逻辑放到一台单独 ...

  8. AJAX其实就是一个异步网络请求

    AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).其实就是一个异步网络请求. 一.创建对象 var xmlhttp; if (w ...

  9. WPF 多线程 UI:设计一个异步加载 UI 的容器

    对于 WPF 程序,如果你有某一个 UI 控件非常复杂,很有可能会卡住主 UI,给用户软件很卡的感受.但如果此时能有一个加载动画,那么就不会感受到那么卡顿了.UI 的卡住不同于 IO 操作或者密集的 ...

随机推荐

  1. mysql优化技巧《转》

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  2. linux清空文件等有用的指令

    1).    > filename 2).    :> filename 3).   echo "" > filename  (文件大小被截为1字节) 4).   ...

  3. Java异常与运行时异常,以及与线程的关系

    具体可以看这篇文章:http://www.cnblogs.com/charlesblc/p/6171103.html 都写在里面了,为了避免更新不一致,这里就不再写一遍了.只给个链接. 注意Java和 ...

  4. 【浏览器渲染原理】渲染树构建之渲染树和DOM树的关系(转载 学习中。。。)

    在DOM树构建的同时,浏览器会构建渲染树(render tree).渲染树的节点(渲染器),在Gecko中称为frame,而在webkit中称为renderer.渲染器是在文档解析和创建DOM节点后创 ...

  5. TCP/IP 小知识

    子网掩码有数百种,这里只介绍最常用的两种子网掩码,它们分别是“255.255.255.0”和“255.255.0.0”. 1.子网掩码是“255.255.255.0”的网络:最后面一个数字可以在0~2 ...

  6. Windows 内存架构

    理解 Virtual Memory, Physical Memory, Committed Memory, Page File, Working Set, Modified Pages, Standb ...

  7. 20160808_Linux服务

    1. http://bbs.csdn.net/topics/370100269 2. http://blog.csdn.net/csfreebird/article/details/8239933 h ...

  8. hiho_1059_string matching content length

    题目大意 两个字符串strA和strB(长度最大为2100),他们中按照顺序有一些公共的子串,且公共子串的长度大于等于3,否则不认为是合法的,比如 abcdef 和 abcxcdef, 按照顺序有合法 ...

  9. 利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码

    利用php CI force_download($filename, $data) 下载.csv 文件解决文件名乱码,文件内容乱码 2014-07-31 12:53 1047人阅读 评论(0) 收藏  ...

  10. 图解javascript中this指向

    JavaScript 是一种脚本语言,支持函数式编程.闭包.基于原型的继承等高级功能.JavaScript一开始看起来感觉会很容易入门,但是随着使用的深入,你会发JavaScript其实很难掌握,有些 ...