Tag: task parallel library

何时缓存任务?

我正在观看异步的禅:最佳性能的最佳实践和Stephen Toub开始谈论任务缓存,而不是缓存任务作业的结果,你自己缓存任务。 据我所知,为每项工作开始一项新任务是昂贵的,应尽量减少。 在28:00左右,他展示了这种方法: private static ConcurrentDictionary s_urlToContents; public static async Task GetContentsAsync(string url) { string contents; if(!s_urlToContents.TryGetValue(url, out contents)) { var response = new HttpClient().GetAsync(url); contents = response.EnsureSuccessStatusCode().Content.ReadAsString(); s_urlToContents.TryAdd(url, contents); } return contents; } 首先看起来像是一个很好的思考方法,你缓存结果,我没有考虑缓存获取内容的工作。 而且他展示了这种方法: private static ConcurrentDictionary<string, Task> s_urlToContents; public static Task GetContentsAsync(string url) { Task contents; if(!s_urlToContents.TryGetValue(url, out contents)) { contents […]

一个代码示例说明了async / await和Reactive(Rx)扩展的范例之间的区别?

两个系统。 .NET的react native扩展和新的C#5.0(.NET 4.5) async/await追求(或基于) future和promises构造范式(方法)。 你能给出(*)最简单的C#代码示例来说明它们之间的区别吗? (*) 没有I / O,互联网或数据库连接是否可能? 更新: 好吧,如果以前似乎回答了这个问题,让我重新制定一下。 为什么在使用本机.NET Iobservable / IObserver + await / async时会添加并开始使用.NET的Reactive(Rx)扩展? 有什么可能的例子说明Rx会在没有Rx的情况下做出同样更笨拙或效率更低的东西(即只使用原生的.NET Iobservable / IObserver + await / async方法)?

multithreading重入问题

我正在尝试为某些处理生成不同的线程。 我for每个线程中的一些逻辑使用for循环索引。 如何在下面的代码中获取不同的线程来打印1,2,3,4,5? 每次我运行这个,我得到不同的数字作为输出 – 3,3,3,4,6,6和2,2,3,5,5,6等。 我尝试使用锁定对象,但它没有正确执行。 任何人都可以帮我解决这个问题。 我只是想确保每个线程/任务获得正确的索引。 请注意,每个任务都被强制在单独的线程上运行。 List tasks1 = new List(); for (int j = 1; j { Console.WriteLine(j); } , new CancellationToken() , TaskCreationOptions.LongRunning , TaskScheduler.Default) ); } Task.WaitAll(tasks1.ToArray()); Console.Read();

经常性背景任务

我刚刚开始尝试使用“任务”而不是线程,并尝试使用后台“清理”任务实现一个对象,该任务每5分钟运行一次,只要该对象正在使用但不应阻止垃圾收集。 一些粗糙的东西(显然不起作用……) public class Foo : IDisposable { private CancellationTokenSource _tokenSource = new CancellationTokenSource(); public Foo() { Cleanup(); } public void Dispose() { _tokenSource.Cancel(); } public void Cleanup() { Task.Delay(TimeSpan.FromSeconds(5), _tokenSource.Token).ContinueWith(t => { //Do Work if (!_tokenSource.IsCancellationRequested) { Cleanup(); } }, TaskContinuationOptions.NotOnCanceled); } } 实施的正确方法是什么? 编辑为了回应I3arnon的问题,我正在使用IDisposable,因为当我完成对象时,我希望它被垃圾收集。 例如,如果没有下面的f.Dispose()(取消任务,f似乎不是Garbage Collected,或者取消了清理任务。有没有更好的方法来实现? var f = new Foo(); var r […]

并行执行Web服务调用

我看到这些问题建议在大约一年前在ASP.NET和Async.Parallel或Array.Parallel.Map 中并行执行.NET HttpWebRequests,并且想知道他们的建议是否仍然存在或者现在是否有更好的方法使用Task并行库 。 我的情况更接近第二个问题,除了我只需要打10个(不是)不同的网络服务而不是相同的3000次。 由于这是一个Web应用程序,这种请求放大是否会改变建议的方法? 有更好的方法吗? 随着用户数量的增加,我可以期待这样的规模如何扩展? 几点说明: 缓存结果将是下一个实现细节,但我希望首先使用基本function 每个Web服务返回非常少的数据(在kb下),最长的数据返回不超过3秒,我相信大部分是延迟(生成的结果不是计算上昂贵的) 从客户端调用Web服务是行不通的(我不认为),因为有些是在不同的域中 F#实现的C#都可以理想地工作,这将被抽象为一个方法调用,它接受一个string并返回一个string集合s

通过async / await进行服务器通信?

我想通过async / await创建通过TAP发送Socket消息。 在阅读了这个答案之后 – 我决定创建一个完全正常的样本: 那我尝试了什么: 我从这里获取了TAP扩展方法(一切正常):我在控制台cmd中测试它: 接收代码 public static class SocketExtensions { public static Task ReceiveTaskAsync(this Socket socket, byte[] buffer, int offset, int count) { return Task.Factory.FromAsync( socket.BeginReceive(buffer, offset, count, SocketFlags.None, null, socket), socket.EndReceive); } public static async Task ReceiveExactTaskAsync(this Socket socket, int len) { byte[] buf = new byte[len]; int totalRead = […]

为什么这个并行代码比它的类似非并行版本慢?

我有以下代码(从LINQPad复制)。 显然,看起来我不理解TPL如何工作或代码是垃圾,为什么并行版本运行速度比非并行版本慢? for (int i = 0; i < 100; i++) { ParallelOptions ops = new ParallelOptions(); ops.MaxDegreeOfParallelism = Environment.ProcessorCount; var watch = Stopwatch.StartNew(); Parallel.ForEach(Enumerable.Range(1, 10000000), ops, x => { int y = x + 1; }); watch.Stop(); Console.WriteLine(“Parallel: {0}”, watch.Elapsed.TotalSeconds); watch = Stopwatch.StartNew(); foreach (var x in Enumerable.Range(1, 10000000)) { int y = x […]

使用.Result的异步方法

以下方法循环遍历postdata列表以对令牌发出多个请求,例如,每个请求都使用特定的clientID。 我的问题与异步有关。 我试图让令牌的调用是异步的。 使用.Result是否必然使方法同步? public async Task ReturnDataFromUrl1(List<List<KeyValuePair>> listOfPostData) { List<Task> taskList = new List<Task>(); string allTokens = “”; List<Task> downloadTasks = new List<Task>(); foreach (var postData in listOfPostData) { using (var client = new HttpClient()) { client.BaseAddress = new Uri(“http://localhost:23081”); HttpContent httpContent = new FormUrlEncodedContent(postData); HttpResponseMessage response = client.PostAsync(“/Token”, httpContent).Result; var responsecode = (int)response.StatusCode; […]

自定义任务运行器方法抛出ArgumentException

由于CultureInfo没有从一个线程复制到另一个线程,我已经使用以下方法为我做这件事。 public static StartCustomTask(Action action, TaskCreationOptions tco = TaskCreationOptions.None) { var currentCult = Thread.CurrentThread.CurrentCuture; var currentUiCult = Thread.CurrentThread.CurrentUICulture; return Task.Factory.StartNew(() => { Thread.CurrentThread.CurrentCuture = currentCult; Thread.CurrentThread.CurrentUICulture = currentUiCult; action(); }, tco); } 基本上这个代码将文化信息从当前线程复制到将要执行action的线程。 我不知道为什么,但它抛出System.ArgumentException说Value does not fall within the expected range 。 我试图在主线程上定期运行动作,它完美无缺。 我的意思是,作为一个动作的方法本身没有问题,我想在上面的代码中有一个问题。 这是exception的堆栈跟踪 at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at System.Web.Hosting.IIS7WorkerRequest.GetServerVariableInternal(String name) at System.Web.HttpRequest.BuildUrl(Func`1 […]

在另一个线程中执行时间方法,并在超时时中止

嗨我试图运行方法异步,以便计时持续时间,并在超过超时时取消方法。 我试过用async和await来实现它。 但没有运气。 也许我过度工程,任何投入都将受到赞赏 应该注意的是,我无法更改接口“他们的接口”(因此名称) 代码到目前为止: using System; using System.Diagnostics; public interface TheirInterface { void DoHeavyWork(); } public class Result { public TimeSpan Elapsed { get; set; } public Exception Exception { get; set; } public Result(TimeSpan elapsed, Exception exception) { Elapsed = elapsed; Exception = exception; } } public class TaskTest { public void […]