【问题标题】:Is creating instances of a class inside a static PageMethod thread safe?在静态 PageMethod 线程中创建类的实例是否安全?
【发布时间】:2010-12-14 15:19:00
【问题描述】:

我正在使用 jQuery 来调用 PageMethods。对于某些操作,必须验证当前用户凭据,而对于其他操作,我需要调用其他静态方法。下面是一些示例代码:

示例 #1

[WebMethod]
public static void PostComment(string comment)
{
    UserAuth auth = new UserAuth();
    if (auth.isAuthenticated)
        {
            //Post comment here...
        }
}

示例 #2

[WebMethod]
public static string GetComment(int commentId)
{

    commentDto comment = //get comment data from the database...
    string friendlyDate = ConvertFriendlyDate(comment.commentDate);

    return friendlyDate + " " + comment.text;
}

public static string ConvertFriendlyDate(DateTime commentDate)
{
    string friendlyDate = //call static utility method to convert date to friendly format

    return friendlyDate;

}

使用这些类型的操作是否安全?

我最好放弃页面方法并为我的 AJAX 请求调用单独的 ASPX 页面吗?

【问题讨论】:

  • 如果我从每个需要处理用户登录的页面方法中调用一个通用静态方法,那会是线程安全的吗?

标签: c# asp.net static-methods pagemethods


【解决方案1】:

来自http://msdn.microsoft.com/en-us/library/system.web.ui.page.aspx

“此类型 [Page] 的任何公共静态(在 Visual Basic 中为 Shared)成员都是线程安全的。不保证任何实例成员都是线程安全的。”

因此,只要您的静态方法不触及类范围的对象,您就应该没问题。例如这可能很糟糕:

static UserAuth auth;
[WebMethod]
public static void PostComment(string comment)
{
    auth = new UserAuth();
    if (auth.isAuthenticated)
        {
            //Post comment here...
        }
}

【讨论】:

  • 明白了..所以只要一切都是自包含的,那么我应该没问题。
【解决方案2】:

您提供的示例看起来不错。如果您正在重用一个对象的实例,那么我会确保该对象是线程安全的。

【讨论】:

    【解决方案3】:

    只要您不接触任何共享资源,它就应该是线程安全的。

    【讨论】:

    • 我已经阅读了教科书信息,寻找更多的见解。
    【解决方案4】:

    看看你的类是否是不可变的,如果它被改变,没有人可以改变它的状态,它将是一个新的实例,你不需要担心线程问题,但是如果你正在改变一些共享状态,那么你应该考虑同步,但我认为您不需要任何线程同步。

    【讨论】:

    • 我认为页面方法必须是这样的,但我可能错了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多