VerySource

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

异常困惑!!!!异常困惑!!!!

[复制链接]

2

主题

7

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-1-25 20:20: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()来进行异步访问。这种我没试。




回复

使用道具 举报

2

主题

7

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
 楼主| 发表于 2020-2-15 13:15:01 | 显示全部楼层
MyPubsService是代理类,getauthors 是webservice方法
serverWebService是自定类
回复

使用道具 举报

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

本版积分规则

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

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