jjzjj

c# - Task.Factory.FromAsync 和 BeginX/EndX 之间的区别?

在使用来自TcpClient的标准BeginRead和EndRead方法以及使用Task.Factory.FromAsync时,我有非常相似的代码。这里有一些例子..错误处理代码没有显示。Task.Factory.FromAsync:privatevoidRead(Statestate){Taskread=Task.Factory.FromAsync(state.Stream.BeginRead,state.Stream.EndRead,state.Bytes,state.BytesRead,state.Bytes.Length-state.BytesRead,state,TaskCr

c# - 为什么 Task.WaitAll() 不会在此处阻塞或导致死锁?

在下面的示例中,使用了两个await调用。为了获得性能,样本被转换为Task.WaitAll()(实际上并没有更快,但这只是一个例子)。这是在Android上使用Sqlite.Net的库中的代码,该方法是从主UI线程上的OnResume()调用的:publicasyncTaskSetupDatabaseAsync(){awaitCreateTableAsync();awaitCreateTableAsync();}这是替代方案:publicvoidSetupDatabaseAsync(){vart1=CreateTableAsync();vart2=CreateTableAsync()

c# - 在异步方法中验证参数

我正在编写一个具有相同方法的同步和异步版本的类voidMyMethod(对象参数)和TaskMyMethodAsync(对象参数)。在同步版本中,我使用简单的检查来验证参数if(argument==null)thrownewArgumentNullException("argument");同样的检查在异步方法中应该是什么样子?1)与同步方法相同2)(第一个回答后更新)if(argument==null)returnnewTask.Factory.StartNew(()=>{thrownewArgumentNullException("argument");});

c# - 为什么等待冷任务不抛出

我只是想看看在等待冷任务(即尚未启动的Task)时会发生什么。令我惊讶的是,代码永远挂起,“Finsihed”从未打印出来。我希望抛出异常。publicasyncTaskTest1(){vartask=newTask(()=>Thread.Sleep(1000));//task.Start();awaittask;}voidMain(){Test1().Wait();Console.WriteLine("Finished");}然后我想也许任务可以从另一个线程开始,所以我将代码更改为:publicasyncTaskTest1(){vartask=newTask(()=>Thread.S

c# - 我应该使用什么作为虚拟等待?

我有一个基类,它提供了一个具有以下签名的方法:virtualasyncTaskRunAsync()派生类应该用类似的东西覆盖这个实现publicoverrideasyncTaskRunAsync(){awaitbase.RunAsync();awaitthis.DoSomethingElse();}现在,编译器警告我Base.RunAsync缺少await语句。我希望我的代码没有警告,而不是抑制警告,并且即使派生类不提供覆盖实现,它也无需提供null检查即可运行,因此使用virtualTaskRunAsync()(省略async关键字)是不可能的。目前,基本方法中的实现是awaitTa

c# - 使用 Task.Run 调用异步方法似乎是错误的?

我最近看到这段代码是由我们为我们工作的承包商编写的。它要么非常聪明,要么非常愚蠢(我认为是后者,但我想要第二个意见)。我在asyncawait上的速度不是很快。基本上它是这样工作的:publicboolSend(TemplatedMessageDtomessage){returnTask.Run(()=>SendAsync(message)).GetAwaiter().GetResult();}publicasyncTaskSendAsync(TemplatedMessageDtomessage){//codedoingstuffvarresults=await_externalres

c# - Task<TResult> 可以/应该包装在 C# 5.0 等待中,它在 TResult 中是协变的吗?

我非常喜欢使用C#5.0异步编程。然而,有几个地方更新旧代码以与TAP模型保持一致给我带来了问题。这是其中之一-我不确定为什么Task在TResult中不是协变的,但在尝试更新协变接口(interface)以从同步模式移动到异步模式时,它给我带来了问题:旧代码:publicinterfaceIInitializable//**outgenericmodifier**{//////Booleantoindicateifclassisready///boolIsInitialized{get;}//////Callsforinstancetobeinitializedusingcurren

c# - Task<T> 与 C# 中的异步委托(delegate)?

我有这个简单的方法:staticintWork(strings){returns.Length;}我可以运行它:Tasktask=Task.Factory.StartNew(()=>Work("lalala"));...intresult=task.Result;或者用这个:Funcmethod=Work;IAsyncResultmyIasync=method.BeginInvoke("lalala",null,null);...intresult=method.EndInvoke(myIasync);他们都使用线程池线程。都等待执行完成(读取值时)两者都向调用者重新抛出任何异常。我什

c# - 将参数传递到 Task.Factory.StartNew

给定以下代码:stringinjectedString="ReadstringoutofHttpContext";Task.Factory.StartNew(()=>{MyClassmyClass=newMyClass();myClass.Method(injectedString);}这是将字符串传递到任务/线程的最佳方式吗?我对这种方法的担忧是:垃圾收集器会知道字符串什么时候失效吗?上下文并正确清理它?有没有更好的方法将依赖项注入(inject)任务,从而打破主线程中对象的链接?这是在Asp.Net网络服务中,如果它很重要并且是一个即发即忘类型的线程,我不会等待任何类型的响应。我的

C# 任务工厂超时

我必须在一个线程中执行一个长进程操作,然后将结果返回给一个函数来继续。这是我的代码:Task.Factory.StartNew(()=>{try{//longoperationwhichreturnnewProductEventArgswithalistofproduct}catch(Exceptione){returnnewProductEventArgs(){E=e};}}).ContinueWith((x)=>handleResult(x.Result),TaskScheduler.FromCurrentSynchronizationContext());问题实际上是我没有超时。