Tag: task parallel library

如果有条件,是否可以使用Task ?

在Windows Phone 8中,我有方法public async Task authentication() 。 该函数的返回类型是bool但是当我尝试在if条件中使用其返回值时,错误表示无法将Task转换为bool 。 public async Task authentication() { var pairs = new List<KeyValuePair> { new KeyValuePair (“user”, _username), new KeyValuePair (“password”, _password) }; var serverData = serverConnection.connect(“login.php”, pairs); RootObject json = JsonConvert.DeserializeObject(await serverData); if (json.logined != “false”) { _firsname = json.data.firsname; _lastname = json.data.lastname; _id = json.data.id; _phone = […]

调用API时在何处使用并发

在ac #project项目中我正在调用一个web api,问题是我在一个方法的循环中做它们。 通常没有那么多,但即使我正在考虑利用并行性。 到目前为止我正在尝试的是 public void DeployView(int itemId, string itemCode, int environmentTypeId) { using (var client = new HttpClient()) { client.BaseAddress = new Uri(ConfigurationManager.AppSettings[“ApiUrl”]); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); var agents = _agentRepository.GetAgentsByitemId(itemId); var tasks = agents.Select(async a => { var viewPostRequest = new { AgentId = a.AgentId, itemCode = itemCode, EnvironmentId = environmentTypeId }; var […]

将TryDequeue放入while循环中是否安全?

我之前没有使用过并发队列。 可以在while循环中使用如下所示的TryDequeue吗? 难道这不会永远陷入困境吗? var cq = new ConcurrentQueue(); cq.Enqueue(“test”); string retValue; while(!cq.TryDequeue(out retValue)) { // Maybe sleep? } //Do rest of code

抛出exception时,任务不处于故障状态

我似乎无法弄清楚为什么我的任务在以下示例中抛出exception时不处于故障状态(假设engine.Send(…)抛出exception): var receiverTask = new Task(async () => { result = await Task.FromResult(engine.Send(someObject)); }); receiverTask.Start(); receiverTask.Wait(); 如果我在receiverTask.Wait()之后执行receiverTask.IsFaulted ,它会返回false而不是true,正如我所期望的那样。 我一直在读,我需要使用类似以下构造的东西: receiverTask.ContinueWith(t => { /* error handling */ }, TaskContinuationOptions.OnlyOnFaulted); 但我似乎无法弄清楚如何将其集成到示例代码中。 我在Start()之前调用它吗? 在Wait()之前? 我希望调用程序以某种方式意识到receiverTask已抛出exception并失败。 有什么指针吗?

用于馈线应用的multithreading架构

这是我在这里的第一篇文章,如果结构不合理,请道歉。 我们的任务是设计一个工具,它将: 读取(帐户ID)文件,CSV格式 从Web下载每个帐户的帐户数据文件(通过Id)(REST API) 将文件传递给将生成报告的转换器(财务预测等)[~20ms] 如果预测阈值在限制范围内,运行解析器来分析数据[400ms] 为上面的分析生成报告[80ms] 将生成的所有文件上传到Web(REST API) 现在所有这些个点都相对容易。 我很想知道如何最好地构建一些东西来处理这个并在我们的硬件上快速有效地完成它。 我们必须处理大约2百万个账户。 方括号可以了解每个流程平均需要多长时间。 我想使用机器上可用的最大资源–24核Xeon处理器。 这不是一个内存密集型过程。 使用TPL并将每个作为一项任务创建是一个好主意吗? 每个都必须按顺序发生,但许多可以一次完成。 不幸的是,解析器不是multithreading感知的,我们没有源(它本质上是我们的黑盒子)。 我的想法是这样的 – 假设我们正在使用TPL: 加载帐户数据(基本上是CSV导入或SQL SELECT) 对于每个帐户(Id): 下载每个帐户的数据文件 继续使用数据文件,发送到转换器 ContinueWith check threshold,发送给解析器 ContinueWith生成报告 ContinueWith上传输出 这听起来可行还是我没有正确理解? 以不同的方式分解步骤会更好吗? 我有点不确定如何处理解析器抛出exception的问题(它非常挑剔)或者当我们上传失败时。 所有这些都将在预定的作业中,作为控制台应用程序在下class后运行。

如何在Windows 10中的c#中的异步方法中从返回的任务中提取数据

如何从下面的foreach循环中的getResponseFromUrl的返回值中提取数据:这里我无法从返回的值中提取数据。 我正在windows 10通用应用程序开发中构建一个应用程序。 var response = NetworkingCalls.getResponseFromUrl(url, requestDictionary); foreach (KeyValuePair item in response) { Util.debugLog(item.Key.ToString(), item.Value.ToString()); } 这是返回字典的模型代码 using System; using System.Collections.Generic; using System.Threading.Tasks; using Windows.Storage.Streams; using Windows.Web.Http; namespace App2.WrittenLibraries { class NetworkingCalls { public async static Task<Dictionary> getResponseFromUrl(string urlString, Dictionary requestDictionary) { var client = new HttpClient(); Uri url = new Uri(urlString); var requestToSend […]

TPL Dataflow本地存储或类似的东西

我想要完成的是我有一个MaxDegreeOfParallelism = 4的动作块。 我想为每个并行路径创建一个会话对象的本地实例,所以我想要总共4个会话对象。 如果这是线程,我会创建类似于: ThreadLocal sessionPerThread = new ThreadLocal(() => new Session()); 我知道块不是线程所以我正在寻找类似但是块的东西。 有没有办法创造这个? 这个区块在服务中并且可以连续运行数月。 在此期间,大量线程用于块的每个并发槽,因此线程本地存储不合适。 我需要一些与逻辑块槽相关的东西。 此块也永远不会完成,它会运行服务的整个生命周期。 注意:以上建议的答案对我要求的内容无效。 我特别要求与本地线程不同的东西,上面的答案是使用本地线程。 这完全是一个不同的问题。

从WPF视图模型中的属性设置器调用异步方法是错误的吗?

当属性更改其值时,我想调用从Web服务获取数据的异步方法,然后更新UI绑定到的另一个属性,从而导致UI更新。 我觉得更新是异步的,因为我希望UI在更新过程中保持响应。 从非异步setter调用异步方法是错误的吗? 我注意到如果异步方法返回void,那么VS不会抱怨,但如果它返回Task,那么visual studio会抱怨没有等待调用。 我的代码如下所示: public int Property1 { set { _property1 = value; NotityPropertyChanged(); UpdateData(); } } private async void UpdateData() { // show data loading message var data = await GetDataFromWebService(); Property2 = data; // hide data loading message } 它似乎工作,但我想知道如果返回类型为Task,如果我从VS获得警告,我是否按照预期的方式使用异步。 更新:一些答案和评论建议用户使用命令而不是更新以响应属性的更改。 对于我的情况,我不确定如何应用,所以提供有关UI如何工作的更多细节。 在用户界面中,有日期选择器(绑定到视图模型上有问题的属性),用户在该日期选择器中选择要查看记录的日期。 当用户选择新日期时,应用程序应显示忙碌指示符,然后在后台获取记录以避免阻止UI线程。 优选地,我希望在选择日期时启动更新,而不需要用户在选择日期之后按下按钮。 将日期选择器的SelectionChanged事件绑定到ViewModel上的async命令或者是否具有SelectionChanged的同步处理程序更好,它会直接调用视图模型上的update方法吗?

为什么有些异步方法需要返回类型的Task,而有些则不需要

在Microsoft的此示例中 ,该方法的返回类型为Task 例1: async Task AccessTheWebAsync() { // You need to add a reference to System.Net.Http to declare client. HttpClient client = new HttpClient(); // GetStringAsync returns a Task. That means that when you await the // task you’ll get a string (urlContents). Task getStringTask = client.GetStringAsync(“http://msdn.microsoft.com”); // You can do work here that doesn’t […]

C#中的异步下载文件

我对C#中的异步操作有疑问。 假设我有一些像这样的代码: public async void Download(string[] urls) { for(int i = 0; i < urls.Length; i++); { await DownloadHelper.DownloadAsync(urls[i], @"C:\" + i.ToString() + ".mp3"); } } 但是这段代码并没有真正异步下载文件。 它开始从第一个URL下载文件,然后等待此操作。 然后它开始从第二个URL下载文件……依此类推。 从而逐个下载文件,我想让它们同时开始下载。 我怎么能这样做?