标签: task-parallel-library

使用等待和自制异步方法的问题

为什么返回a的方法Task在返回它的实例时不会被执行.我认为这必须发生,因为await方法/委托会将它放入某个队列,然后执行生成的任务.

那么为什么这Task在调用时永远不会被执行Do()

public void Do()
{
    SomeTask().Wait()
}

public async Task SomeTask()
{
    return new Task(() => { Console.WriteLine("Hello World!") });
}
Run Code Online (Sandbox Code Playgroud)

编辑

或者我需要await Task.Run(...)吗?

非常感谢你!

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

0
推荐指数
1
解决办法
48
查看次数

为什么异步Parallel.ForEach中的异常会使应用程序崩溃?

如果在控制台应用程序中运行而不是将其抛出AggregateException并被外部捕获,以下的崩溃为什么会崩溃try/catch

I've simplified the use case for the await for brevity, but in the relevant code I am indeed trying to execute an awaitable Task of importance.

var list = new List<string>() {"Error"};

        try
        {
            Parallel.ForEach(list, new ParallelOptions()
            {
                MaxDegreeOfParallelism = 8
            }, async listEntry =>
            {
                await Task.Delay(5000);
                throw new Exception("Exception");
            });
        }
        catch (Exception ex)
        {
            //never hits, the application crashes
        }

        Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

I note that the following does not cause the application to …

c# exception task-parallel-library parallel.foreach

0
推荐指数
1
解决办法
1051
查看次数

在Async/Await方法中使用ThreadPool和Task.Wait

我刚刚遇到这个代码.我立即开始畏缩和自言自语(不是好事).事情是我不明白为什么,也不能合理地阐明它.它对我来说真的很糟糕 - 也许我错了.

public async Task<IHttpActionResult> ProcessAsync()
{
     var userName = Username.LogonName(User.Identity.Name);    
     var user = await _user.GetUserAsync(userName);

     ThreadPool.QueueUserWorkItem((arg) =>
        {
            Task.Run(() => _billing.ProcessAsync(user)).Wait();
        });    
     return Ok();
}
Run Code Online (Sandbox Code Playgroud)

这段代码让我觉得它不必要地用ThreadPool.QueueUserWorkItem和创建线程Task.Run.此外,它看起来有可能在重负载时出现死锁或造成严重的资源问题.我对么?

_billing.ProcessAsync()方法是等待的(异步),所以我希望一个简单的"await"关键字是正确的,而不是所有这些其他的包袱.

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

0
推荐指数
1
解决办法
1041
查看次数

等待任务和等待Task.WhenAll之间的区别

使用await多个等待任务与等待所有任务完成时有什么区别.我的理解是方案2在性能方面更好,因为asyncTask1和asyncTask2都是并行执行的.

方案1:

async Task Task()
{
   await asyncTask1();
   await asyncTask2();
}
Run Code Online (Sandbox Code Playgroud)

方案2:

async Task Task()
{
    t1 = asyncTask1();
    t2 =  asyncTask2();
    await Task.WhenAll(createWorkflowtask, getTaskWorkflowTask);
}
Run Code Online (Sandbox Code Playgroud)

c# asynchronous task-parallel-library async-await

0
推荐指数
1
解决办法
2165
查看次数

Dropbox.Api无法上传大文件

我使用以下代码将文件上传到dropbox.

我正在使用nuget包Dropbox.Api并获取异常System.Threading.Tasks.TaskCanceledException("任务被取消.")

从这个SO问题看来,它似乎是一个超时问题.

那么如何修改以下代码来设置超时.

    public async Task<FileMetadata> UploadFileToDropBox(string fileToUpload, string folder)
    {
        DropboxClient client = new DropboxClient(GetAccessToken());

        using (var mem = new MemoryStream(File.ReadAllBytes(fileToUpload)))
        {
            string filename = Path.GetFileName(fileToUpload);

            try
            {
                string megapath = GetFullFolderPath(folder);
                string megapathWithFile = Path.Combine(megapath, Path.GetFileName(Path.GetFileName(filename))).Replace("\\", "/");
                var updated = client.Files.UploadAsync(megapathWithFile, WriteMode.Overwrite.Instance, body: mem);
                await updated;
                return updated.Result;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# task-parallel-library dropbox-api

0
推荐指数
1
解决办法
743
查看次数

异步方法await关键字不会挂起到调用方法

我有以下代码行,了解async-await和暂停,直到等待任务完成.

public async Task<string> WaitAsynchronouslyAsync()
    {
        var results = await WaitAsync();
        Console.WriteLine($@"I am not waiting");
        return results;
    }

    public async Task<string> WaitAsync()
    {
        await Task.Delay(10000).ConfigureAwait(false);
        return "Async programming suspension point demo.";
    }
Run Code Online (Sandbox Code Playgroud)

await操作者挂起执行,直到工作WaitAsync()(延迟10秒)的方法完成.

与此同时,我期待在将Console.WriteLine($@"I am not waiting");等待任务完成之前将文本写入输出窗口,因为控件将返回给调用者WaitAsync().当任务完成执行时,await表达式计算string("Async programming suspension point demo.").

我在这里与悬浮指针vs调试指针混淆了吗?

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

0
推荐指数
1
解决办法
668
查看次数

在处理大量数据时降低CPU使用率

我正在编写一个实时应用程序,它每秒接收大约2000条消息,这些消息被推入队列中.我编写了一个后台线程来处理队列中的消息.

private void ProcessSocketMessage()
{
    while (!this.shouldStopProcessing)
    {
        while (this.messageQueue.Count > 0)
        {
            string message;
            bool result = this.messageQueue.TryDequeue(out message);
            if (result)
            {
               // Process the string and do some other stuff
               // Like updating the received message in a datagrid  
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

上述代码的问题在于它使用了大约12%CPU(2.40 GHz双核处理器)的疯狂处理能力.

我有4个类似于上面的块,它实际上占用了50%的CPU计算能力.在上面的代码中有什么可以优化的吗?

在第二次循环结束之前添加100 ms的线程休眠似乎会使性能提高50%.但我做错了吗?

c# multithreading winforms task-parallel-library tpl-dataflow

0
推荐指数
1
解决办法
455
查看次数

当并行foreach中的公共变量增加时,如何获取下一个值?

我有一个在foreach中更新的公共变量,它是一个计数器,所以我想让一个并行foreach中的下一个计数器.

我有类似的东西:

int myCommonCounter = 5;
Parallel.Foreach(myList, (iterator, state) =>
{
    if(iterator.MyProperty == X)
    {
        iterator.Position = miCommonCounter;
        miCommonCounter = miCommonCunter + 1;
    }
});
Run Code Online (Sandbox Code Playgroud)

我想避免属性iterator.Position中的间隙,也避免重复.

我已经看到了一个例子来处理部分结果的总和,例如在本文档中,但它并不是我需要的相同情况.

因此,我想知道是否有任何更新计数器以避免在并行foreach内部更新时出现间隙和重复.

谢谢.

c# task-parallel-library parallel.foreach

0
推荐指数
1
解决办法
87
查看次数

异步或并行任务 - C#

我有一个应用程序,我需要做两个I/O任务:获取GPS位置,通过蓝牙检索一些数据.这两项任务都可以在不同时间内完成,并且可能需要很长时间.为了提高应用程序的速度,我想同时启动两个活动,然后等待两个活动完成再继续.

如果我这样做:

bool locationStatus= await GetCurrentLocation();
bool vehicleStatus = await GetVehicleData();
Run Code Online (Sandbox Code Playgroud)

第二个功能是否被启动,或者只是未被阻止的UI?

我需要调用并行任务吗?

c# asynchronous task-parallel-library async-await

0
推荐指数
1
解决办法
200
查看次数

如何将两个任务集合链接在一起?

我正在尝试运行一系列任务,然后一旦完成,就运行一个单独的任务集合.实质上,第一个任务集合负责写入某些数据库表,最终的任务集合将这些表中的数据整理到报告表中.

我正在使用的代码示例如下:

var dbWriteTasks = clients.Select(c => DoSomeWorkAsync(c)).ToArray();
var dbCollateTasks = clients.Select(c => DoSomeOtherWorkAsync(c));

Task.Factory.ContinueWhenAll(dbWriteTasks, t => dbCollateTasks.ToArray());
Run Code Online (Sandbox Code Playgroud)

这是成功运行第一组任务,但没有运行任何第二组任务,所以我显然做错了.

我也试过这个无济于事:

var dbWriteTasks = clients.Select(c => DoSomeWorkAsync(c)).ToArray();
var dbCollateTasks = clients.Select(c => DoSomeOtherWorkAsync(c)).ToArray();

Task.Factory.ContinueWhenAll(dbWriteTasks, t => dbCollateTasks);
Run Code Online (Sandbox Code Playgroud)

这会运行两组任务,但第二组在第一组任务完成插入之前开始运行并处理数据...

我还应该提一下,我已经尝试同步运行这两组任务,Task.WaitAll但这也没有用.我试图在Azure功能中执行所有这些操作,Task.WaitAll只是让它停止.

我对TPL比较陌生,所以任何建议都将不胜感激!

c# multithreading azure task-parallel-library azure-functions

0
推荐指数
1
解决办法
72
查看次数