相关疑难解决方法(0)

"UseTaskFriendlySynchronizationContext"的含义是什么?

asp.net 4.5中有一个新的应用程序设置

<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
Run Code Online (Sandbox Code Playgroud)

像这样的代码可以在asp.net 4.0中运行

protected void Button1_Click(object sender, EventArgs e)
{
    CallAysnc();
}

public void CallAysnc()
{
    AsyncOperation asyncOp = AsyncOperationManager.CreateOperation(Guid.NewGuid().ToString());

    WebClient client = new WebClient();
    client.DownloadStringCompleted += (object sender, DownloadStringCompletedEventArgs e) =>
    {
        asyncOp.PostOperationCompleted(CallCompleted, e.Result);
    };
    client.DownloadStringAsync(new Uri("http://www.google.com"));
}

private void CallCompleted(object args)
{
    Response.Write(args.ToString());
}
Run Code Online (Sandbox Code Playgroud)

但它在asp.net 4.5中不起作用,当我删除新的appsetting时,它再次起作用!

那么"UseTaskFriendlySynchronizationContext"的含义是什么?

asp.net asynchronous

64
推荐指数
2
解决办法
3万
查看次数

使用async/await调用WCF服务的模式

我使用基于任务的操作生成了代理.

如何使用async/await 正确调用此服务(处理ServiceClientOperationContext之后)?

我的第一次尝试是:

public async Task<HomeInfo> GetHomeInfoAsync(DateTime timestamp)
{
    using (var helper = new ServiceHelper<ServiceClient, ServiceContract>())
    {
        return await helper.Proxy.GetHomeInfoAsync(timestamp);
    }
}
Run Code Online (Sandbox Code Playgroud)

作为ServiceHelper一个创造ServiceClientOperationContextScope后来处理它们的类:

try
{
    if (_operationContextScope != null)
    {
        _operationContextScope.Dispose();
    }

    if (_serviceClient != null)
    {
        if (_serviceClient.State != CommunicationState.Faulted)
        {
            _serviceClient.Close();
        }
        else
        {
            _serviceClient.Abort();
        }
    }
}
catch (CommunicationException)
{
    _serviceClient.Abort();
}
catch (TimeoutException)
{
    _serviceClient.Abort();
}
catch (Exception)
{
    _serviceClient.Abort();
    throw;
}
finally …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net wcf async-await

59
推荐指数
2
解决办法
5万
查看次数

使用"async"(即使它应该完成)作为MVC路由的一部分,会使路由死锁; 怎么能避免这个?

考虑以下(基于默认的MVC模板),这是在后台发生的一些"东西"的简化版本 - 它完成得很好,并显示预期的结果,20:

public ActionResult Index()
{
    var task = SlowDouble(10);
    string result;
    if (task.Wait(2000))
    {
        result = task.Result.ToString();
    }
    else
    {
        result = "timeout";
    }

    ViewBag.Message = result;
    return View();
}
internal static Task<long> SlowDouble(long val)
{
    TaskCompletionSource<long> result = new TaskCompletionSource<long>();
    ThreadPool.QueueUserWorkItem(delegate
    {
        Thread.Sleep(50);
        result.SetResult(val * 2);
    });
    return result.Task;
}
Run Code Online (Sandbox Code Playgroud)

但是,现在如果我们async在混合中添加一些:

public static async Task<long> IndirectSlowDouble(long val)
{
    long result = await SlowDouble(val);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

并将路线中的第一行更改为:

var task = IndirectSlowDouble(10);
Run Code Online (Sandbox Code Playgroud)

然后它不起作用 ; 它反而超时了.如果我们添加断点,方法 …

.net asp.net asp.net-mvc asynchronous task-parallel-library

19
推荐指数
3
解决办法
1815
查看次数

异步CTP错误 - 任务永远不会完成

首先是道歉:我无法将以下错误隔离到一个简单的控制台应用程序中.但是,在我相对简单的ASP.NET Web窗体应用程序中,以下代码将导致当前线程无限期地阻塞:

public class MyModule : IHttpModule
{
    public void Dispose()
    {
    }

    public void Init(System.Web.HttpApplication context)
    {
        context.BeginRequest += this.Context_BeginRequest;
    }

    private void Context_BeginRequest(object sender, EventArgs e)
    {
        Sleep().Wait();
        var x = 2; // This line is never hit.
    }

    private async Task Sleep()
    {
        await TaskEx.Run(() => System.Threading.Thread.Sleep(1000));
    }
}
Run Code Online (Sandbox Code Playgroud)

任务状态仍然是'WaitingForActivation'.有谁知道为什么会这样?

.net c# asp.net task-parallel-library async-ctp

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