C# 螺纹不';Don’我好像不是在后台跑步

C# 螺纹不';Don’我好像不是在后台跑步,c#,asp.net,multithreading,asynchronous,.net-4.0,C#,Asp.net,Multithreading,Asynchronous,.net 4.0,我有以下代码: public class BaseControlClass : System.Web.UI.UserControl { protected delegate void AsyncronousAction(); protected virtual void FAsyncEvent() { } //Overidden on derived classes. protected void Page_Load(object sender, EventArgs e

我有以下代码:

public class BaseControlClass : System.Web.UI.UserControl
{
    protected delegate void AsyncronousAction();
    protected virtual void FAsyncEvent() { } //Overidden on derived classes.

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
            FPerformAsyncronousTasks(FAsyncEvent);
    }

    protected virtual void FPerformAsyncronousTasks(AsyncronousAction AsyncCallback)
    {
        new Thread(delegate()
        {
            AsyncCallback();
        }).Start();
    }
}

public class DerivedControlClass : BaseClass
{
    protected override void FAsyncEvent()
    {
        //Contact web service, wait for results, add to local database.
    }
}
我所期望的是加载页面,并在派生类中运行
FAsyncEvent()
中的代码。然而,页面直到
FAsyncEvent()
中的代码完成后才完成加载

我在这里穿线有问题吗


编辑奇怪的是,我注意到如果我执行一个干净的->构建,然后运行代码,它工作正常,页面在与web服务联系时完成加载。但后续运行意味着页面将等待线程完成处理。

您的代码将保持对UserControl的引用处于活动状态,这可能会阻止请求继续。尝试向新线程传递一个静态方法,就像快速检查并查看是否有帮助一样。

至少对我来说没有什么问题。如果您在页面加载(而不是额外的方法调用)中完成所有操作,它看起来还可以,行吗?i、 e.
if(!Page.IsPostBack)新线程(委托(){FAsyncEvent();}).Start()Invoke
吗?@ChrisK-不,谢谢。@Luan-你能看到我的编辑吗,你认为你的答案能解释这种行为吗?可能吧。默认情况下,ASP.NET尝试使请求显示为单线程。这也意味着,无论何时,当您使用来自同一用户的两个请求之间共享的内容(例如会话)时,它都会自动使用锁来确保不会发生任何错误。因此,如果您在后台线程中运行了会话操作,并且尝试在页面中使用会话,则必须等待后台线程完成。如果是这样的话,您可以将所有会话值传递给正在执行的方法-同样,使用方法静态有助于防止不必要的锁定。@Luan-感谢您的解释,在我的例子中,它实际上可能是会话,我将看一看。我现在不能真正使用静态类,因为我希望能够覆盖它们,但我们会看到。如果您想保留实例,只需确保它们不是用户控件或页面之类的。这意味着更多的样板代码,但它仍然应该是可管理的-只需向基类添加一个虚拟GetAsyncWorker方法,它将返回实际的(简单的)类,该类具有您想要调用的方法-没有附加任何ASP.NET字符串。我传递了一些对象,这些对象在控件之间共享。在阅读了你关于会话的帖子后,我尝试重新实例化这些会话,这似乎解决了问题。非常感谢您的时间和详细解释。