如何从 Web 应用程序中的另一个线程更新变量?

Posted

技术标签:

【中文标题】如何从 Web 应用程序中的另一个线程更新变量?【英文标题】:How do I update the variable from another thread in web application? 【发布时间】:2021-08-02 15:55:27 【问题描述】:

我的过程是当按钮单击时创建一个后台线程来执行某些过程。完成该过程后,会将变量更新为 true。但是,我在线程内进行更新,但在主线程中没有更新。

public partial class frm1 : System.Web.UI.Page

    public bool iscomplete = false;

    Worker workerObject = new Worker();
    
    protected void btnPrint_Click(object sender, EventArgs e)
    
        Thread t1 = new Thread(PrintFunction);
        t1.IsBackground = true;
        t1.Start();
        t1.Name = "PrintThread";
    
    
    public void PrintFunction()
    
        //Do process and update iscomplete to true
        workerObject.RequestStop();
        t1.Join();
    

protected void Timer1_Tick(object sender, EventArgs e)
        

                if (workerObject.isComplete == true)
                

                    GetData();
                    RadGrid1.Rebind();

                

        


public class Worker


    public void RequestStop()
    
        _isComplete = true;
    
    // Keyword volatile is used as a hint to the compiler that this data
    // member is accessed by multiple threads.
    private volatile bool _isComplete;
    public bool isComplete
    
        get
        
            return _isComplete;
        
        set
        
            _isComplete = value;
        
    

线程处理完成后如何更新变量?

【问题讨论】:

你应该考虑回调机制而不是这种后台线程方法。 "但在主线程中没有更新" - 什么主线程? Web 应用程序本身没有“主线程”;如果这是一个 Web 请求,那么原始请求在返回时可能早已不复存在,除非您在某处阻塞。你如何测试这个?如果您正在执行while (!isComplete) 循环:是的,不要这样做 - 事实上,您几乎可以肯定不应该创建Thread 根本在 Web 应用程序中(线程很昂贵;也许考虑线程池) 【参考方案1】:

你可以声明volatile:

private volatile bool _isComplete;
public bool isComplete

    get
    
        return _isComplete;
    
    set
    
        _isComplete = value;
    

您也可以创建callback。

陷阱:正如 Marc Gravell 在问题的评论部分指出的那样,您认为是主线程的线程可能在您的第二个线程更新变量时已经不存在。你需要意识到这一点。如果这是一个问题,那么您可能需要通过将第二个线程连接到“主”线程来同步线程。

【讨论】:

嗨@Lajos Arpad,我已经根据您的建议更新了我的问题。但是,我仍然无法获得更新后的值。 @THG 您可能在更改之前指的是它。你试过在线程上调用 Join 吗? 嗨@Lajos Arpad,是的,我试试。是一样的。我的过程就像单击按钮时它将启动计时器事件。计时器事件将检查变量(未完成)。线程完成后,此变量将更新为 true。

以上是关于如何从 Web 应用程序中的另一个线程更新变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我可以从 android 中的另一个线程更新视图?

从java中的另一个线程访问一个线程的变量

从qt中的另一个线程运行qtconcurrent时如何关闭程序

无法从使用 c# 在不同线程上运行的另一个页面 User.cs 更新 GUI (MainWindow.xaml) 中的进度条

如何从同一 Azure AD 中的另一个 Web 应用程序访问 Web api?

向同一进程中的另一个线程发出信号