Tag: async await

如何将Task 转换为Task ?

由于C#的Task是一个类,你显然无法将Task转换为Task 。 但是,你可以这样做: public async Task Run() { return await MethodThatReturnsDerivedTask(); } 是否有一个静态任务方法我可以调用来获取一个Task实例,该实例基本上只指向底层任务并转换结果? 我喜欢这样的东西: public Task Run() { return Task.FromDerived(MethodThatReturnsDerivedTask()); } 这种方法存在吗? 是否仅为此目的使用异步方法有任何开销?

在C#中使用async而不等待?

考虑在没有等待的情况下使用async 。 想想也许你误解了异步的作用。 警告是完全正确的:如果您将方法标记为异步但不在任何地方使用等待,那么您的方法将不是异步的。 如果你调用它,方法中的所有代码将同步执行。 我想编写一个应该运行异步但不需要使用await的方法。例如在使用线程时 public async Task PushCallAsync(CallNotificationInfo callNotificationInfo) { Logger.LogInfo(“Pushing new call {0} with {1} id”.Fill(callNotificationInfo.CallerId, } 我想调用PushCallAsync并运行异步,不想使用等待。 我可以在C#中使用async而不等待吗?

MoveNext而不是实际的方法/任务名称

使用log4net声明为: private readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType()); 在异步方法或任务中,如下所示: public async void CheckSomething() { log.Info(null); //…. } 记录MoveNext而不是CheckSomething 。 知道如何让它记录一个实际的方法名称?

Async /等待没有按预期反应

使用下面的代码我希望字符串“Finished”出现在控制台上的“Ready”之前。 有人可以向我解释,为什么等待不等待完成这个样本中的任务? static void Main(string[] args) { TestAsync(); Console.WriteLine(“Ready!”); Console.ReadKey(); } private async static void TestAsync() { await DoSomething(); Console.WriteLine(“Finished”); } private static Task DoSomething() { var ret = Task.Run(() => { for (int i = 1; i < 10; i++) { Thread.Sleep(100); } }); return ret; }

将ManualResetEvent包装为等待任务

我想等待手动重置事件,超时并观察取消。 我想出了类似下面的东西。 手动重置事件对象由我无法控制的API提供。 有没有办法在不接受和阻止ThreadPool的线程的情况下实现这一点? static Task TaskFromWaitHandle(WaitHandle mre, int timeout, CancellationToken ct) { return Task.Run(() => { bool s = WaitHandle.WaitAny(new WaitHandle[] { mre, ct.WaitHandle }, timeout) == 0; ct.ThrowIfCancellationRequested(); return s; }, ct); } // … if (await TaskFromWaitHandle(manualResetEvent, 1000, cts.Token)) { // true if event was set } else { // false if […]

在方法签名中使用async关键字在Web Api端点中返回Task

如果我想通过返回一个Task对象来编写一个非阻塞的web api动作,我可以使用或不使用async关键字这样做: 使用异步 public async Task Get() { Func slowCall = () => { Thread.Sleep(2000); return Request.CreateResponse(HttpStatusCode.OK, “Hello world”); }; var task = Task.Factory.StartNew(slowCall); return await task; } 不使用异步 public Task Get() { Func slowCall = () => { Thread.Sleep(2000); return Request.CreateResponse(HttpStatusCode.OK, “Hello world”); }; var task = Task.Factory.StartNew(slowCall); return task; } 他们都正常工作。 但是,我在编写返回Task的web api操作时看到的每个例子(在线和书籍)都使用async关键字。 […]

Async threadsafe从MemoryCache获取

我创建了一个使用.NET MemoryCache的异步缓存。 这是代码 public async Task GetAsync(string key, Func<Task> populator, TimeSpan expire, object parameters) { if(parameters != null) key += JsonConvert.SerializeObject(parameters); if(!_cache.Contains(key)) { var data = await populator(); lock(_cache) { if(!_cache.Contains(key)) //Check again but locked this time _cache.Add(key, data, DateTimeOffset.Now.Add(expire)); } } return (T)_cache.Get(key); } 我认为唯一的缺点是我需要在锁外等待,所以populator不是线程安全的,但是因为await不能驻留在锁内,我想这是最好的方法。 我错过了任何陷阱吗? 更新 :当antoher线程使缓存无效时,Esers应答的版本也是线程安全的 public async Task GetAsync(string key, Func<Task> […]

死锁使用异步和等待

我想在我的程序中实现的是以下callstack / workflow: 调度() 授权() httpPost() 我的想法是, httpPost()将是异步的,而其他2种方法仍然是非同步的。 但是,出于某种原因,除非我做了2 + 3,否则它对我不起作用。 异步。 也许我还有一些误解。 根据我的理解,我可以a)在调用异步方法时使用await -keyword(这将挂起方法并在异步方法完成后继续),或b)省略await -keyword而是调用async的Task.Result方法返回值,它将阻塞直到结果可用。 让我告诉你工作的例子: private int dispatch(string options) { int res = authorize(options).Result; return res; } static async private Task authorize(string options) { string values= getValuesFromOptions(options); KeyValuePair response = await httpPost(url, values); return 0; } public static async Task<KeyValuePair> httpPost(string url, List<KeyValuePair> […]

C#async / await Task 对象上的Progress事件

我完全不async C#5的新async / await关键字,我对实现进度事件的最佳方式感兴趣。 现在我更喜欢它,如果一个Progress事件在Task本身上。 我知道我可以把事件放在包含异步方法的类中,并在事件处理程序中传递某种状态对象,但对我而言,这似乎更像是一种解决方法而不是解决方案。 我可能还需要不同的任务来触发不同对象中的事件处理程序,这听起来很混乱。 有没有办法可以做类似以下的事情?: var task = scanner.PerformScanAsync(); task.ProgressUpdate += scanner_ProgressUpdate; return await task;

从异步函数获取当前方法名称?

无论如何从异步函数中获取当前方法名称? 我试过了: System.Reflection.MethodInfo.GetCurrentMethod(); 我尝试使用StackTrace和StrackFrame如下: StackTrace strackTrace = new StackTrace(); for (int i = 0; i < strackTrace.GetFrames().Length; i++) { SafeNativeMethods.EtwTraceInfo("Function" + i + ":" + function); SafeNativeMethods.EtwTraceInfo("Type" + i + ":" + strackTrace.GetFrame(i).GetType().Name); SafeNativeMethods.EtwTraceInfo("Method" + i + ":" + strackTrace.GetFrame(i).GetMethod().Name); SafeNativeMethods.EtwTraceInfo("ToString Call" + i + ":" + strackTrace.GetFrame(i).ToString()); } 但它们似乎都不起作用,我会得到“.ctor”,“InvokeMethod”,“Invoke”,“CreateInstance”,“CreateKnownObject”或“CreateUnknownObject”或“MoveNext” 关于我如何做到这一点的任何想法? 我想创建一个通用的记录器函数,我不想传入调用记录器函数的函数的名称,所以我尝试了stacktrace方法,没有用。 我放弃了,并说,好吧,我将传递函数名称作为第一个参数,但是当我从调用generics记录器函数的调用函数调用reflection方法时,我总是得到“.ctor” 有任何想法吗? 注意我正在调用的通用记录器函数是同一个类中的静态方法(现在必须以这种方式…)。