当你有服务器端代码(即一些ApiController)并且你的函数是异步的 - 所以它们返回Task<SomeObject>- 你认为最好的做法是等待你调用的函数ConfigureAwait(false)吗?
我已经读过它更高效,因为它不必将线程上下文切换回原始线程上下文.但是,使用ASP.NET Web Api,如果您的请求是在一个线程上进行的,并且等待某些函数和调用ConfigureAwait(false),则可能会在返回ApiController函数的最终结果时将您置于不同的线程上.
我在下面输入了一个我正在谈论的例子:
public class CustomerController : ApiController
{
public async Task<Customer> Get(int id)
{
// you are on a particular thread here
var customer = await SomeAsyncFunctionThatGetsCustomer(id).ConfigureAwait(false);
// now you are on a different thread! will that cause problems?
return customer;
}
}
Run Code Online (Sandbox Code Playgroud) 我有以下代码:
MemoryStream foo(){
MemoryStream ms = new MemoryStream();
// write stuff to ms
return ms;
}
void bar(){
MemoryStream ms2 = foo();
// do stuff with ms2
return;
}
Run Code Online (Sandbox Code Playgroud)
我分配的MemoryStream是否有可能以后不能被处理掉?
我有一个同行评审坚持我手动关闭它,我找不到信息来判断他是否有一个有效点.
根据文件:
"a
SemaphoreSlim不使用Windows内核信号量".
是否有任何特殊资源SemaphoreSlim使得Dispose在SemaphoreSlim不再使用遗嘱时呼叫很重要?
我最近发现自己需要一种类型安全的"即发即忘"机制来异步运行代码.
理想情况下,我想要做的是:
var myAction = (Action)(() => Console.WriteLine("yada yada"));
myAction.FireAndForget(); // async invocation
Run Code Online (Sandbox Code Playgroud)
不幸的是,BeginInvoke()没有相应的调用的明显选择EndInvoke()不起作用 - 它导致资源泄漏缓慢(因为asyn状态由运行时保持并且从未释放...它期望最终调用EndInvoke().我也无法运行.NET线程池上的代码,因为它可能需要很长时间才能完成(建议只在线程池上运行相对短暂的代码) - 这使得无法使用ThreadPool.QueueUserWorkItem().
起初,我只需要这一行为,其签名匹配方法Action,Action<...>或Func<...>.所以我把一组扩展方法(见下面的清单)放在一起,让我在不遇到资源泄漏的情况下这样做.每个版本的Action/Func都有重载.
不幸的是,我现在想将此代码移植到.NET 4,其中Action和Func上的泛型参数的数量已大幅增加.在我编写T4脚本来生成这些之前,我还希望找到一种更简单,更优雅的方法来实现这一点.欢迎任何想法.
public static class AsyncExt
{
public static void FireAndForget( this Action action )
{
action.BeginInvoke(OnActionCompleted, action);
}
public static void FireAndForget<T1>( this Action<T1> action, T1 arg1 )
{
action.BeginInvoke(arg1, OnActionCompleted<T1>, action);
}
public static void FireAndForget<T1,T2>( this Action<T1,T2> action, T1 arg1, T2 arg2 )
{ …Run Code Online (Sandbox Code Playgroud) 我对使用声明有些怀疑:
我有一个叫做的课
MyJob是一次性的.然后我在MyJob JobResults上也有一个属性也是Disposable.
我的代码:
using (MyJob job = new MyJob())
{
//do something.
FormatResults(job.JobResults)
}
public string FormatResuls(JobResuts results)
{
}
Run Code Online (Sandbox Code Playgroud)
我的第一个问题是:在这种情况下,使用块是MyJob和MyJob.Results处理或只有MyJob和NOT MyJob.Results?
我也在C#中执行wrt任务的并行处理:
Tasks allTasks = List<Tasks>
try
{
foreach(Task t in allTasks)
{
// Each tasks makes use of an IDisposable object.
t.Start();
}
Task.WaitAll(allTasks);
}
catch(AggregateExecption aex)
{
/// How do I ensure that all IDisposables are disposed properly if an exception happens in any of the tasks?
}
Run Code Online (Sandbox Code Playgroud)
我的第二个问题,在上面的代码中,在处理任务中的异常时,确保正确处理对象的正确方法是什么?
对不起,如果我的问题太天真或令人困惑,因为我仍在努力学习和理解C#.多谢你们!
考虑一下我对异步委托主题的看法.
如果我想以异步方式异步调用方法,这是一种合适的方法吗?
Action action = DoSomething;
action.BeginInvoke(action.EndInvoke, null);
Run Code Online (Sandbox Code Playgroud)
该DoSomething()方法捕获所有异常并在内部处理它们.
电话EndInvoke适当吗?需要?
是否有更清晰的方法来实现相同的行为?
.NET中的许多对象(SQLCommand例如)实现IDisposable.作为一般规则,如果我创建一个IDisposable对象的实例,我应该总是处置它吗?
我是否以某种方式删除了此任务或它是自毁的?
Task.Factory.StartNew(() => { DoSomeJob(); }, TaskCreationOptions.LongRunning);
Run Code Online (Sandbox Code Playgroud)
或者最好像使用它一样
var t = Task.Factory.StartNew(() => { DoSomeJob(); }, TaskCreationOptions.LongRunning);
Run Code Online (Sandbox Code Playgroud)
以某种方式后来删除/ nullize t?
谢谢!
我一直在看这篇关于在C#中使用任务的文章,如果有人可以为我清理一些东西,我就会徘徊?
不调用等待任务会失败创建任务的目的,因为它不会冻结主线程,因为现在主线程必须等待任务完成.
我假设不会立即调用等待,所以现在你什么时候打电话或者你怎么知道什么时候处理这个任务.假设我们有一个这样的简单案例:
void MyFunction()
{
Task t = Task.Factory.StartNew(() => { System.Threading.Thread.Sleep(5000); });
}
Run Code Online (Sandbox Code Playgroud)
如果你直接调用t.Wait(),主线程仍然会等待5秒才能做其他任何事情,从用户的角度来看,这有点失败,他们将无法做任何事情,持续5秒.你怎么知道5秒后任务完成了?你可以处理t?处理这个问题的正确方法是什么?
对不起,如果问题真的很天真:(谢谢大家:D
c# ×9
.net ×4
asynchronous ×2
idisposable ×2
.net-4.0 ×1
async-await ×1
delegates ×1
dispose ×1
generics ×1
memory-leaks ×1
memorystream ×1
semaphore ×1
task ×1