VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 693|回复: 5

线程问题,高手指教!!!!!

[复制链接]

2

主题

7

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-25 22:00:01 | 显示全部楼层 |阅读模式
我利用winform调用webservice,想在客户端实现异步访问(或者说多线程)。
我想有三种方式:
1、我用了代理类的异步访问方法和事件(GetMethodAsync和methodCompleted)。
在form的Button1_Click中调用wsClient.GetMethodAsync()开始异步访问webservice.在methodCompleted中利用参数获得webservice返回结果。然后绑定到窗体中实例化的datagrid中。这种方式是ok的.
代码片段:
private MyPubsService pubsService;webservice代理
private DataSet ds;
        public Form1()
        {
            InitializeComponent();
            pubsService = new MyPubsService();
            pubsService.GetAuthorsCompleted += new GetAuthorsCompletedEventHandler(pubsService_GetAuthorsCompleted);
            this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
        }

        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            pubsService.Dispose();
        }

        void pubsService_GetAuthorsCompleted(object sender, GetAuthorsCompletedEventArgs e)
        {
            ds = (DataSet)e.Result;
            dataGridView1.DataSource = ds.Tables[0].DefaultView;
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
     
            pubsService.GetAuthorsAsync();
           
        }*/
2、我想利用代理实体的BeginInvoke()和Endinvoke()方法以及回调函数来实现。
   在回调函数中获得的dataset实体是没有问题的。但在回调函数中,利用
  dataGrid1.datasource=ds.tables[0].defaultview;时,在运行时报异常
-----------线程间操作无效,从不是创建datagrid1控件的线程访问它。----
百思不得其解,请老师指教!
代码片段:
  using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Web.Services;
using WinFormWebService.WS;
using System.Threading;

namespace WinFormWebService
{
    public partial class Form1 : Form
    {



        ServerWebService wbSData;
        private DataSet ds;
        delegateBindData delg;
        public Form1()
        {
            InitializeComponent();
            wbSData = new ServerWebService();
            delg = new delegateBindData(wbSData.GetBindData);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            IAsyncResult ar = delg.BeginInvoke(new AsyncCallback(CallBackFn), delg);

        }
        void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (wbSData.pubsService != null)
            {
                wbSData.pubsService.Dispose();
            }
        }
        void CallBackFn(IAsyncResult ar)
        {
            delg = (delegateBindData)ar.AsyncState;
            ds = delg.EndInvoke(ar);
            dataGrid1.DataSource = ds.Tables[0].DefaultView;

        }
        public class ServerWebService
    {
        public  MyPubsService pubsService;
        public ServerWebService()
        {
            pubsService = new MyPubsService();
        }
        public  DataSet GetBindData()
        {
            DataSet ds = pubsService.GetAuthors();
            return ds;

        }
        
        
    }
    public delegate DataSet delegateBindData();
}
3、利用常规的线程方法,thread.start()来进行异步访问。这种我没试。
MyPubsService是代理类,getauthors 是webservice方法
serverWebService是自定类


回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-16 23:45:02 | 显示全部楼层
不同线程的UI控件是不能互相访问的,得通过invoke 调用。
回复

使用道具 举报

0

主题

9

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-2-18 01:00:01 | 显示全部楼层
同意楼上,使用托管
回复

使用道具 举报

2

主题

7

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-2-19 16:00:01 | 显示全部楼层
请给一个具体的方案
回复

使用道具 举报

0

主题

9

帖子

8.00

积分

新手上路

Rank: 1

积分
8.00
发表于 2020-2-19 19:30:02 | 显示全部楼层
// The following code assumes a 'ListBox' and a 'Button' control are added to a form,
// containing a delegate which encapsulates a method that adds items to the listbox.

   public class MyThreadClass
   {
      MyFormControl myFormControl1;
      public MyThreadClass(MyFormControl myForm)
      {
         myFormControl1 = myForm;
      }

      public void Run()
      {
         // Execute the specified delegate on the thread that owns
         // 'myFormControl1' control's underlying window handle.
         myFormControl1.Invoke(myFormControl1.myDelegate);
      }
   }
回复

使用道具 举报

2

主题

7

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-2-20 14:45:01 | 显示全部楼层
比如说:程序刚启动,datagrid被主线程实例化,在窗体的一个事件方法中启动一个线程。那么在这个线程的委托方法中是无法访问datagrid吗?但是数据实体可以。是这样的吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表