Как синхронизировать доступ к Списку <T> используемый в ASP.NET?

Вот как я это сделаю в APi

public ActionResult SomeActionMethod() {
  return Json(new {foo="bar", baz="Blech"});
}

Если вы хотите использовать JsonConverter и контролировать, как данные сериализуются, то

  public class JsonNetResult : ActionResult
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="JsonNetResult"/> class.
        /// </summary>
        public JsonNetResult()
        {
        }

        /// <summary>
        /// Gets or sets the content encoding.
        /// </summary>
        /// <value>The content encoding.</value>
        public Encoding ContentEncoding { get; set; }

        /// <summary>
        /// Gets or sets the type of the content.
        /// </summary>
        /// <value>The type of the content.</value>
        public string ContentType { get; set; }

        /// <summary>
        /// Gets or sets the data.
        /// </summary>
        /// <value>The data object.</value>
        public object Data { get; set; }


        /// <summary>
        /// Enables processing of the result of an action method by a custom type that inherits from the <see cref="T:System.Web.Mvc.ActionResult"/> class.
        /// </summary>
        /// <param name="context">The context in which the result is executed. The context information includes the controller, HTTP content, request context, and route data.</param>
        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            HttpResponseBase response = context.HttpContext.Response;

            response.ContentType = !String.IsNullOrWhiteSpace(this.ContentType) ? this.ContentType : "application/json";

            if (this.ContentEncoding != null)
            {
                response.ContentEncoding = this.ContentEncoding;
            }


            if (this.Data != null)
            {

                response.Write(JsonConvert.SerializeObject(this.Data));

            }
        }
    }

Blockquote [117 ]

    public class CallbackJsonResult : JsonNetResult
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        public CallbackJsonResult(HttpStatusCode statusCode)
        {
            this.Initialize(statusCode, null, null);
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        public CallbackJsonResult(HttpStatusCode statusCode, string description)
        {
            this.Initialize(statusCode, description, null);
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="data">The callback result data.</param>
        public CallbackJsonResult(object data, HttpStatusCode statusCode = HttpStatusCode.OK)
        {
            this.ContentType = null;
            this.Initialize(statusCode, null, data);
        }



        /// <summary>
        /// Initializes a new instance of the <see cref="CallbackJsonResult"/> class.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        /// <param name="data">The callback result data.</param>
        public CallbackJsonResult(HttpStatusCode statusCode, string description, object data)
        {
            this.Initialize(statusCode, description, data);
        }

        /// <summary>
        /// Initializes this instance.
        /// </summary>
        /// <param name="statusCode">The status code.</param>
        /// <param name="description">The description.</param>
        /// <param name="data">The callback result data.</param>
        private void Initialize(HttpStatusCode statusCode, string description, object data)
        {
            Data = new JsonData() { Success = statusCode == HttpStatusCode.OK, Status = (int)statusCode, Description = description, Data = data };
        }
    }
}

затем создайте расширение

/// <summary>
/// return Json Action Result
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="o"></param>
/// <param name="JsonFormatting"></param>
/// <returns></returns>
public static CallbackJsonResult ViewResult<T>(this T o)
{
    return new CallbackJsonResult(o);
}

Нет APi, просто используйте созданное вами расширение

public ActionResult SomeActionMethod() {
  return new { error = "", code = (int)HttpStatusCode.OK, data = leads}.ViewResult();
}
5
задан Azhar 22 October 2011 в 12:27
поделиться

3 ответа

Таким образом, этот список в оперативной памяти совместно используется запросами? Это походит на потенциальную причину проблем, даже когда у Вас есть блокировка. Изменяемых общих наборов нужно обычно избегать, IME.

Обратите внимание, что, если Вы действительно решаете синхронизироваться, необходимо будет сделать вещи как блокировка списка для целого хода итерации по нему и других составных операций. Просто соединение каждого определенного доступа не достаточно хорошо.

7
ответ дан 18 December 2019 в 12:03
поделиться

Используя блокировку корректный способ синхронизировать доступ к универсальным наборам. доступ к набору распространен повсеместно, можно создать класс обертки для обертывания доступа к набору, таким образом, поверхность взаимодействия уменьшается. Можно затем представить синхронизацию в переносящемся объекте.

4
ответ дан 18 December 2019 в 12:03
поделиться

Да, необходимо заблокировать - использующий Список. SyncRoot как это:

lock (myList.SyncRoot) 
{
    // Access the collection.
}
4
ответ дан 18 December 2019 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: