用VB做了个ActiveX控件,调用C#编写的WebService,代码如下:
    Dim responseText, photoAddr, photoName, photoExt As String
    lblTips.Caption = "共需上传 " & SelectedPics & " 张图片,当前正在上传第 1 张"
    ProgressBar1.Max = SelectedPics
    
    For i = 0 To SelectedPics - 1
        photoAddr = fPhotoUpload.GetPhotoAddress(i)
        photoName = ParseFileName(photoAddr)
        photoExt = GetFileExt(photoName)
        responseText = soapClient.AddUserLocalPicture(sequence, 3, fPhotoUpload.GetBytes(i), photoName, "." & photoExt)
        lblTips.Caption = "共需上传 " & SelectedPics & " 张图片,当前正在上传第 " & i + 1 & " 张"
        ProgressBar1.Value = ProgressBar1.Value + 1
        If ProgressBar1.Value = ProgressBar1.Max Then
            Unload Me
        End If
        DoEvents
    Next
循环每次调用WebService方法AddUserLocalPicture时,界面都卡住了,虽然能上传成功但看起来不爽。
在C#中可以用多线程或BackGroundWorker来解决,请问各位高手,在VB中怎么解决呢?

解决方案 »

  1.   

    访问的时候会等待返回,vb单线程,必须返回后才执行下边的程序
    soapClient在init响应时间较长,可以在form_load的时候初始化连接,
    但初始化的时候还是会卡住,访问网络时间还是有一点的,就是这样的,程序在等待返回;
    除非你另开线程,vb,哎
      

  2.   

    楼主或许可以让Timer来做这个事情试试,个人感觉好像没什么好办法。
      

  3.   

    如果你只是想解决界面卡的问题,就将上传过程做成ActiveX.exe
      

  4.   

    改写soapClient组件,在上传过程里每上传一定字节数量后就DoEvents一下。
      

  5.   

    即AddUserLocalPicture函数中的循环里加上DoEvents语句。
      

  6.   


    关于ActiveX.exe其实网上示例很多的,晚饭后给你整理了一段,测试通过了,你参考一下吧:'--------------------------------- ActiveX.exe ----------------------------'新建一个ActiveX.exe工程名称: AxTest
    '其中类名称: cTest
    '添加一个窗体,默认名称
    '窗体上加一个Timer控件,默认名称
    'cTest上添加如下代码:Option ExplicitPublic Event TestStart()    '启动测试事件
    Public Event TestEnd()      '结束测试事件
    Public Event Testing()      '这个事件在循环执行过程中触发Private frm As Form
    Private WithEvents oTM As Timer
    Private xCount As Long
    Private xCounting As Long'当前计数只读
    Public Property Get Counting() As Long
        Counting = xCounting
    End Property'初始化
    Private Sub Class_Initialize()
        Set frm = New Form1
        Load frm
        Set oTM = frm.Timer1
        oTM.Enabled = False
    End Sub'消毁
    Private Sub Class_Terminate()
        Set oTM = Nothing
        Unload frm
    End Sub'这个方法用接收主程序参数,通知本程序开始执行任务
    Public Function StartTest(pCount As Long) As Boolean
    'pCount 要执行任务的次数(你根据自己的实际情况设计)
        oTM.Interval = 100
        oTM.Enabled = True
        xCount = pCount
        StartTest = True
    End Function'模拟一个较长时间的操作(你的调用web服务大概就写在这儿吧)
    Private Sub DataTest()
        Dim n As Long
        Dim i
        For n = 1 To 100000000
            i = n * 9
        Next
    End Sub'
    Private Sub otm_Timer()
        oTM.Enabled = False
        Dim i As Long
        RaiseEvent TestStart        '触发TestStart事件
        '循环执行数据处理过程
        For i = 1 To xCount
            Call DataTest           
            xCounting = i           '返回计数
            RaiseEvent Testing      '触发Testing事件,可以让主程序接收当前计数
        Next
        RaiseEvent TestEnd          '触发TestEnd事件
    End Sub
    '--------------------------------------------------------------------------'-------------------------------- 窗体代码 ----------------------------------------
    '引用一下AxTest
    '添加二个CommandBoxOption ExplicitDim WithEvents cls As cTestDim pCount As LongPrivate Sub cls_Testing()
        Me.Caption = "数据处理中,已经完成 " & cls.Counting & " 项"
    End SubPrivate Sub cls_TestStart()
        Me.Caption = "数据处理中,已经完成 " & cls.Counting & " 项"
    End SubPrivate Sub cls_TestEnd()
        Me.Caption = "数据处理完毕,共完成 " & cls.Counting & " 项"
        Set cls = Nothing
        pCount = 0
    End SubPrivate Sub Command1_Click()
        Set cls = New cTest
        pCount = 5
        Call cls.StartTest(pCount)
    End SubPrivate Sub Command2_Click()
        Debug.Print "Test"
    End Sub