相关疑难解决方法(0)

将CurrentCulture保持在异步/等待状态

我有以下伪代码

string GetData()
{
  var steps = new List<Task<string>>
  {
    DoSomeStep(),
    DoSomeStep2()
  };

  await Task.WhenAll(steps);

  return SomeResourceManagerProxy.RetrieveValuesForLocalizedStrings( steps.Select(s => s.Result) );

}
Run Code Online (Sandbox Code Playgroud)

从WebService调用此方法,我Thread.CurrentUICulture根据用户的浏览器设置进行设置.

等待之后,CurrentUICulture丢失了(我在不同的线程上运行).

我用以下方法解决了这个问题:

    public class MyAwaiter<T> : INotifyCompletion
    {
        private TaskAwaiter<T> waiter;
        private CultureInfo culture;

        public MyAwaiter(TaskAwaiter<T> waiter)
        {
            this.waiter = waiter;
        }

        public PreserveCultureAwaiter<T> GetAwaiter() { return this; }

        public bool IsCompleted { get { return waiter.IsCompleted; } }

        public void OnCompleted(Action continuation)
        {
            culture = Thread.CurrentThread.CurrentUICulture;
            waiter.OnCompleted(continuation);
        }

        public T GetResult()
        { …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous

23
推荐指数
2
解决办法
6474
查看次数

在ThreadContextChanged上,AsyncLocal值更新为null

我试图了解AsyncLocal应该如何在.Net 4.6中运行.我将一些数据放入AsyncLocal ......但是当ThreadContext更改时,它被设置为null.我正在使用AsyncLocal的全部原因是在等待异步操作时尝试跨线程保留/缓存此值.知道为什么会特别调用它并在上下文发生变化时设置为null吗?关于AsyncLocal的文档非常稀疏......也许我已经把它弄错了.

public class RequestContextProvider : IRequestContextProvider
{
    private static readonly AsyncLocal<IRequestContext> _requestContext = new AsyncLocal<IRequestContext>(ValueChangedHandler);

    private static void ValueChangedHandler(AsyncLocalValueChangedArgs<IRequestContext> asyncLocalValueChangedArgs)
    {
        **//This is just here to observe changes...when I await a call that 
        //causes control to pass to a different thread..this is called 
        //with a current value of null.**
        var previousValue = asyncLocalValueChangedArgs.PreviousValue;
        var currentValue = asyncLocalValueChangedArgs.CurrentValue;
        var contextChanged = asyncLocalValueChangedArgs.ThreadContextChanged;
    }

    public void SetContext(IRequestContext requestContext)
    {
        _requestContext.Value = requestContext;
    }

    public IRequestContext GetContext()
    {
        return _requestContext.Value;
    } …
Run Code Online (Sandbox Code Playgroud)

c# async-await dnx

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

标签 统计

c# ×2

async-await ×1

asynchronous ×1

dnx ×1