c#winform不是用this.dispatcher.invoke来异步更新ui吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#winform不是用this.dispatcher.invoke来异步更新ui吗?相关的知识,希望对你有一定的参考价值。

c#winform不是用this.dispatcher.invoke来异步更新ui吗?

参考技术A 因为两个线程虽说是异步执行,在宏观看来是同时执行的,但是大多
个人电脑
只有一个cpu并不是多CPU,也就是说并不能真正实现多个线程同时执行;但为了达到类似的效果,cpu处理采用
时间片
的形式,它先分一个cpu时间片给线程a,然后再分一个时间片给线程b,然后再分一个给a执行,即同一时间实际上只有一个线程在执行,所以结果是aabbaabb这样交替执行。

this2.$dispatch 不是函数

【中文标题】this2.$dispatch 不是函数【英文标题】:this2.$dispatch is not a function 【发布时间】:2020-09-13 09:39:25 【问题描述】:

我正在尝试像这样使用 vue.js 中的调度功能。 但是我收到一个错误,说 this2.$dispatch 不是一个函数......就像你在屏幕截图中看到的那样

message.vue

  export default 
    data()
        return
            message:'',
            isLoading:false,
        
    ,

    methods:
        addMessage()
            if(this.message !='')
                this.sendData();
             else
                this.$fire(
                    title: "Error",
                    text: "Enter some text.",
                    type: "error",
                    timer: 3000
                ).then(r => 
                    console.log(r.value);
                );
                setTimeout(() => 
                    this.isLoading = false
                ,700)
            
        ,
        sendData()
            this.isLoading = true;
            this.$http.post('/add-message' , message:this.message, id_rooms:this.$route.params.id_rooms).then((response) => 
                console.log(response.json());
                if(response.body != 'Error')
                    this.message = '';
                    this.$dispatch('new_message', response.json());
                 else
                    this.isLoading = false;
                
            , (response) =>

            );
        
    

然后我试着像这样把它弄出来

chat.vue

 export default 
        components:
            get_message:getMessage,
            add_message:addMessage,
        ,
        data()
            return
                messages:[]
            

        ,
        events:
            'new_message':function(data)
                this.messages.push(data);
            
        

    

我在控制台中遇到这个错误...有什么想法可以解决这个问题吗?

【问题讨论】:

你能提供更多关于你如何称呼this.$dispatch('new_message', response.json());的上下文吗? 最常见的是因为您使用的是this,但它实际上不是您期望的上下文(例如,您在事件处理程序中使用它,它是元素上下文而不是组件上下文)。除非我们知道您如何使用它,否则我们无法确定这一点 @Daniel 我更新了我的代码 你试过this.$store.dispatch('new_message', response.json());吗?我不知道this.$dispatch 是做什么的,但我以前没有遇到过。 @Daniel 是的,我试过了......现在有一个错误 app.js:1980 Uncaught (in promise) TypeError: Cannot read property 'dispatch' of undefined 【参考方案1】:

更新

如果您的商店在 Vue 中注册,它似乎应该可以工作。如果您的$dispatch 在承诺之外工作,您可以尝试将this 上下文存储在另一个变量中

sendData()
    this.isLoading = true;
    const that = this;
    this.$http
        .post('/add-message' , message:this.message, id_rooms:this.$route.params.id_rooms)
        .then((response) => 
            console.log(response.json());
            if(response.body != 'Error')
                that.message = '';
                that.$dispatch('new_message', response.json());
             else
                that.isLoading = false;
            
        , (response) =>

        );

或者只是$dispatch

sendData()
    this.isLoading = true;
    const $dispatch = this.$dispatch;
    this.$http
        .post('/add-message' , message:this.message, id_rooms:this.$route.params.id_rooms)
        .then((response) => 
            console.log(response.json());
            if(response.body != 'Error')
                this.message = '';
                $dispatch('new_message', response.json());
             else
                this.isLoading = false;
            
        , (response) =>

        );


在这里猜测一下,但尝试改为调用它

this.$store.dispatch('new_message', response.json());

或者,您的问题可能是范围问题(看到这是从承诺中调用的)

如果你在 Promise 处理程序 then(function(response)this.$store.dispatch('new_message', response.json());) 中声明了这样的函数,可能是由于范围

你可以尝试使用箭头函数

then((response) => 
  this.$store.dispatch('new_message', response.json());
)

【讨论】:

以上是关于c#winform不是用this.dispatcher.invoke来异步更新ui吗?的主要内容,如果未能解决你的问题,请参考以下文章

在winform项目中如何删除后台项目中储存在文件中的数据, 提醒一下不是用的数据库

c#winform怎么把控件背景设为半透明,像这样

C#WinForm中如何判断鼠标是不是在某个控件以外按下

用c#winform拖的datagridview控件,当选中一行数据以后鼠标离开之后,就选不中了

web service做啥用的,我知道winform是做c/S的软件,webform 是做网站

C#winform问题 datagridview中combobox选项改变触发事件用哪个方法