相关疑难解决方法(0)

为所有服务器端代码调用ConfigureAwait的最佳实践

当你有服务器端代码(即一些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)

c# task-parallel-library async-await asp.net-web-api

517
推荐指数
4
解决办法
18万
查看次数

如果.NET中的MemoryStream未关闭,是否会创建内存泄漏?

我有以下代码:

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是否有可能以后不能被处理掉?

我有一个同行评审坚持我手动关闭它,我找不到信息来判断他是否有一个有效点.

.net c# memory-leaks memorystream

108
推荐指数
6
解决办法
7万
查看次数

我是否需要处理SemaphoreSlim

根据文件:

"a SemaphoreSlim不使用Windows内核信号量".

是否有任何特殊资源SemaphoreSlim使得DisposeSemaphoreSlim不再使用遗嘱时呼叫很重要?

.net c# dispose semaphore idisposable

20
推荐指数
4
解决办法
3812
查看次数

C#中的Typesafe即发即弃异步委托调用

我最近发现自己需要一种类型安全的"即发即忘"机制来异步运行代码.

理想情况下,我想要做的是:

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)

c# generics delegates asynchronous .net-4.0

13
推荐指数
3
解决办法
3295
查看次数

在C#中使用语句用法

我对使用声明有些怀疑:

我有一个叫做的课

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#.多谢你们!

c#

8
推荐指数
1
解决办法
508
查看次数

Fire和忘记异步委托的正确方法

考虑一下我对异步委托主题的看法.

如果我想以异步方式异步调用方法,这是一种合适的方法吗?

Action action = DoSomething;
action.BeginInvoke(action.EndInvoke, null);
Run Code Online (Sandbox Code Playgroud)

DoSomething()方法捕获所有异常并在内部处理它们.

电话EndInvoke适当吗?需要?

是否有更清晰的方法来实现相同的行为?

c# asynchronous

7
推荐指数
3
解决办法
4265
查看次数

我应该丢弃所有一次性物品吗?

.NET中的许多对象(SQLCommand例如)实现IDisposable.作为一般规则,如果我创建一个IDisposable对象的实例,我应该总是处置它吗?

.net c# idisposable

6
推荐指数
1
解决办法
2161
查看次数

如何正确删除任务

我是否以某种方式删除了此任务或它是自毁的?

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?

谢谢!

.net c#

5
推荐指数
1
解决办法
8390
查看次数

C#等待和处理任务


我一直在看这篇关于在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# task

1
推荐指数
1
解决办法
4534
查看次数