标签: task-parallel-library

Task <>和IAsyncOperation <>之间有什么区别

我正在写一个地铁应用程序.

这有效:

    HttpClient client = new HttpClient();
    var bytes = await client.GetByteArrayAsync(new Uri("www.microsoft.com"));
Run Code Online (Sandbox Code Playgroud)

这不是:

    var folder = Windows.Storage.ApplicationData.Current.LocalFolder;
    var file = await folder.GetFileAsync("text.txt");
Run Code Online (Sandbox Code Playgroud)

第一个返回Task <>,第二个返回IAsyncOperation <>

有什么不同?为什么有两种不同的类型?我该如何修复第二个样本?

.net task-parallel-library microsoft-metro

16
推荐指数
1
解决办法
8067
查看次数

Parallel.ForEach vs AsParallel().ForAll

我有一个庞大的集合,我想以平行的方式处理每个对象.同步地执行相同操作通常涉及简单的"foreach".

只是想知道在我的场景中使用什么,即Parallel.ForEach或MyCollection.AsParallel().ForAll().

你能否解释一下使用一对一的好处.

.net task-parallel-library

16
推荐指数
2
解决办法
2万
查看次数

用于自动取消和重新启动任务的模式

是否有建议的自我取消和重启任务模式?

例如,我正在研究背景拼写检查程序的API.拼写检查会话被包装为Task.每个新会话都应该取消之前的会话并等待其终止(以正确地重新使用拼写检查服务提供商等资源).

我想出了这样的事情:

class Spellchecker
{
    Task pendingTask = null; // pending session
    CancellationTokenSource cts = null; // CTS for pending session

    // SpellcheckAsync is called by the client app
    public async Task<bool> SpellcheckAsync(CancellationToken token)
    {
        // SpellcheckAsync can be re-entered
        var previousCts = this.cts;
        var newCts = CancellationTokenSource.CreateLinkedTokenSource(token);
        this.cts = newCts;

        if (IsPendingSession())
        {
            // cancel the previous session and wait for its termination
            if (!previousCts.IsCancellationRequested)
                previousCts.Cancel();
            // this is not expected to throw
            // as the …
Run Code Online (Sandbox Code Playgroud)

.net c# asynchronous task-parallel-library async-await

16
推荐指数
2
解决办法
6386
查看次数

Task.CompletedTask 的 ValueTask 等价物是什么?

我正在实施IAsyncDisposable这要求我返回 a ValueTask,但有时我的 dispose 方法无关。在这种情况下我应该如何返回?

目前我正在返回new ValueTask(Task.CompletedTask)这似乎有效,但由于 valueTasks 的目的是避免创建不必要的堆对象,我相信应该有一种更简单、更有效的方法。

c# asynchronous task-parallel-library valuetask

16
推荐指数
2
解决办法
1582
查看次数

当Task有未处理的异常时,为什么我的进程不会终止?

我正在使用.NET 4.0构建Windows服务.

我在任务中抛出了各种未处理的异常,但它们不会像MSDN文档所述那样终止我的进程(并行任务 - 请参阅未观察到的任务异常).

"如果您没有给故障任务提供传播其异常的机会(例如,通过调用Wait方法),那么当任务被垃圾收集时,运行时将根据当前的.NET异常策略升级任务的未观察异常. ".

即使我使用最简单的任务调用,它的行为也是如此:

Task.Factory.StartNew(() => { throw new Exception(); } 
Run Code Online (Sandbox Code Playgroud)

调用该服务时,该服务保持正常运行.

根据文档,任务的终结器将在任务为GC后重新抛出异常,但这似乎不会发生.MSDN反复声明,正常的".NET异常策略"会导致进程终止.

为什么不终止我的应用程序?我能想到的唯一一件事就是以某种方式提到某个地方的任务(是lambda ??)

.net .net-4.0 task-parallel-library

15
推荐指数
3
解决办法
4902
查看次数

任务链(等待上一个任务完成)

var tasks = new List<Task>();

foreach (var guid in guids)
{
    var task = new Task( ...);
    tasks.Add(task);
}

foreach (var task in tasks)
{
    task.Start();
    Task.WaitAll(task);
}
Run Code Online (Sandbox Code Playgroud)

这是UI线程的运行.我需要一个接一个地执行任务变量中的所有任务.问题是如果我调用Task.WaitAll(任务),UI冻结.如何在不冻结UI的情况下执行以下逻辑?

.net c# task task-parallel-library

15
推荐指数
3
解决办法
2万
查看次数

结合应用程序域远程处理和任务时的死锁

我的应用程序需要将插件加载到单独的应用程序域中,然后异步执行其中的一些代码.我编写了一些代码来包装可Task编组类型:

static class RemoteTask
{
    public static async Task<T> ClientComplete<T>(RemoteTask<T> remoteTask,
                                                  CancellationToken cancellationToken)
    {
        T result;

        using (cancellationToken.Register(remoteTask.Cancel))
        {
            RemoteTaskCompletionSource<T> tcs = new RemoteTaskCompletionSource<T>();
            remoteTask.Complete(tcs);
            result = await tcs.Task;
        }

        await Task.Yield(); // HACK!!

        return result;
    }

    public static RemoteTask<T> ServerStart<T>(Func<CancellationToken, Task<T>> func)
    {
        return new RemoteTask<T>(func);
    }
}

class RemoteTask<T> : MarshalByRefObject
{
    readonly CancellationTokenSource cts = new CancellationTokenSource();
    readonly Task<T> task;

    internal RemoteTask(Func<CancellationToken, Task<T>> starter)
    {
        this.task = starter(cts.Token);
    }

    internal void Complete(RemoteTaskCompletionSource<T> tcs)
    {
        task.ContinueWith(t …
Run Code Online (Sandbox Code Playgroud)

c# deadlock appdomain task-parallel-library

15
推荐指数
1
解决办法
2597
查看次数

从未完成的任务会发生什么?他们妥善处理?

说我有以下课程:

class SomeClass
{
    private TaskCompletionSource<string> _someTask;

    public Task<string> WaitForThing()
    {
        _someTask = new TaskCompletionSource<string>();
        return _someTask.Task;
    }

    //Other code which calls _someTask.SetResult(..);
}
Run Code Online (Sandbox Code Playgroud)

然后别的,我打电话

//Some code..
await someClassInstance.WaitForThing();
//Some more code
Run Code Online (Sandbox Code Playgroud)

//Some more code被调用之前不会被_someTask.SetResult(..)调用.调用上下文在内存中等待.

但是,假设SetResult(..)从未被调用过,并且someClassInstance停止被引用并被垃圾收集.这会造成内存泄漏吗?或.Net自动神奇地知道需要处理调用上下文?

c# task-parallel-library async-await

15
推荐指数
2
解决办法
816
查看次数

ASP.NET Web API 2具有Task.Run性能的异步操作方法

我正在尝试使用几个ASP.NET Web API 2.0端点进行基准测试(使用Apache工作台).其中一个是同步和一个异步.

        [Route("user/{userId}/feeds")]
        [HttpGet]
        public IEnumerable<NewsFeedItem> GetNewsFeedItemsForUser(string userId)
        {
            return _newsFeedService.GetNewsFeedItemsForUser(userId);
        }

        [Route("user/{userId}/feeds/async")]
        [HttpGet]
        public async Task<IEnumerable<NewsFeedItem>> GetNewsFeedItemsForUserAsync(string userId)
        {
            return await Task.Run(() => _newsFeedService.GetNewsFeedItemsForUser(userId));
        }
Run Code Online (Sandbox Code Playgroud)

在观看了Steve Sanderson的演讲之后,ab -n 100 -c 10 http://localhost....向每个端点发出了以下命令.

我很惊讶,因为每个端点的基准似乎大致相同.

关闭史蒂夫解释说我期待异步端点更高效,因为它会立即将线程池线程释放回线程池,从而使它们可用于其他请求并提高吞吐量.但数字看起来完全一样.

我在这里误解了什么?

c# asp.net task-parallel-library async-await asp.net-web-api

15
推荐指数
1
解决办法
3万
查看次数

Task.WaitAll不等待任务完成

在试图找出新的(现在可能不是那么新,但对我而言是新的)TaskC#中的异步编程时,我遇到了一个问题,让我有点想弄清楚,我不知道为什么.

我已经解决了这个问题,但我仍然不确定为什么这是一个问题.我只是觉得我会分享我的经验,以防任何人遇到同样的情况.

如果有任何大师想告诉我这个问题的原因,那就太棒了,非常感激.我总是喜欢知道为什么有些东西不起作用!

我做了一个测试任务,如下:

Random rng = new Random((int)DateTime.UtcNow.Ticks);
int delay = rng.Next(1500, 15000);
Task<Task<object>> testTask = Task.Factory.StartNew<Task<object>>(
    async (obj) =>
        {
            DateTime startTime = DateTime.Now;
            Console.WriteLine("{0} - Starting test task with delay of {1}ms.", DateTime.Now.ToString("h:mm:ss.ffff"), (int)obj);
            await Task.Delay((int)obj);
            Console.WriteLine("{0} - Test task finished after {1}ms.", DateTime.Now.ToString("h:mm:ss.ffff"), (DateTime.Now - startTime).TotalMilliseconds);
            return obj;
        },
        delay
    );
Task<Task<object>>[] tasks = new Task<Task<object>>[] { testTask };

Task.WaitAll(tasks);
Console.WriteLine("{0} - Finished waiting.", DateTime.Now.ToString("h:mm:ss.ffff"));

// make console stay open till user …
Run Code Online (Sandbox Code Playgroud)

.net c# task-parallel-library async-await .net-4.5

15
推荐指数
2
解决办法
1万
查看次数