我在c#winform编程中,有一段时间会不断从网上下载数据 这段时间主窗体会出现卡死现象 20
过段时间又恢复过来了怎样才能不使主窗体出现卡死现象呢,是不是要使用多线程?本人没使用过多线程,如果要使用该怎么用呢?最好能给出示例...
过段时间又恢复过来了
怎样才能不使主窗体出现卡死现象呢,是不是要使用多线程?
本人没使用过多线程,如果要使用 该怎么用呢?
最好能给出示例 展开
怎样才能不使主窗体出现卡死现象呢,是不是要使用多线程?
本人没使用过多线程,如果要使用 该怎么用呢?
最好能给出示例 展开
4个回答
展开全部
你可以用System.Net.WebClient这个类来下载数据,然后为它的下载事件绑定一个方法,因为事件是异步调用的,因此不会造成线程堵塞,给你一段代码看看吧
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
namespace WebClientAsync
{
public delegate void DownloadDelegate( byte[] b);
public class DownloadAsync
{
public event DownloadDelegate DownloadCompleted;
byte[] buf;
public void Downloadasync(string url)
{
WebClient wc = new WebClient();
wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
wc.DownloadDataAsync(new Uri(url));
}
void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
buf = e.Result;
if(DownloadCompleted!=null)
DownloadCompleted(buf);
}
}
class test
{
static void Main()
{
DownloadAsync download = new DownloadAsync();
download.DownloadCompleted += new DownloadDelegate(download_DownloadCompleted);
download.Downloadasync("http://www.baidu.com");
Console.Read();
}
static void download_DownloadCompleted(byte[] b)
{
byte[] buf = b;
string p = Encoding.GetEncoding("gb2312").GetString(buf);
Console.WriteLine(p);
}
}
}
这是个完整的控制台程序,效果为从百度首页http://www.baidu.com上下载数据,然后输出,你把那段下载好的字符串输出在WinForm窗体上就可以,不会造成窗体堵塞的,祝你顺利!
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
namespace WebClientAsync
{
public delegate void DownloadDelegate( byte[] b);
public class DownloadAsync
{
public event DownloadDelegate DownloadCompleted;
byte[] buf;
public void Downloadasync(string url)
{
WebClient wc = new WebClient();
wc.DownloadDataCompleted += new DownloadDataCompletedEventHandler(wc_DownloadDataCompleted);
wc.DownloadDataAsync(new Uri(url));
}
void wc_DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e)
{
buf = e.Result;
if(DownloadCompleted!=null)
DownloadCompleted(buf);
}
}
class test
{
static void Main()
{
DownloadAsync download = new DownloadAsync();
download.DownloadCompleted += new DownloadDelegate(download_DownloadCompleted);
download.Downloadasync("http://www.baidu.com");
Console.Read();
}
static void download_DownloadCompleted(byte[] b)
{
byte[] buf = b;
string p = Encoding.GetEncoding("gb2312").GetString(buf);
Console.WriteLine(p);
}
}
}
这是个完整的控制台程序,效果为从百度首页http://www.baidu.com上下载数据,然后输出,你把那段下载好的字符串输出在WinForm窗体上就可以,不会造成窗体堵塞的,祝你顺利!
展开全部
是不是要用多线程,那要看你在下载时,是不是允许进行其它的各类操作.
如果你的接下来的操作必须要等待数据下载后才能进行,那多线程也会很麻烦.
多线程其实没那么难.只要你把下载的部分进行很好的封装,多线程就是几句钱码的事.
Thread T = new Thread(new ThreadStart(YourDownLoadFunctionName));
T.Start();
private void YourDownLoadFunctionName()
{
//你的下载代码
//在一些可能消耗时间的地方或步骤中,记得加进Thread.Sleep(1)
//经验之谈
}
当然了,T的定义域要合适.
如果你的接下来的操作必须要等待数据下载后才能进行,那多线程也会很麻烦.
多线程其实没那么难.只要你把下载的部分进行很好的封装,多线程就是几句钱码的事.
Thread T = new Thread(new ThreadStart(YourDownLoadFunctionName));
T.Start();
private void YourDownLoadFunctionName()
{
//你的下载代码
//在一些可能消耗时间的地方或步骤中,记得加进Thread.Sleep(1)
//经验之谈
}
当然了,T的定义域要合适.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在循环取数据的时候,,循环体里加上这句
Application.DoEvents()
Application.DoEvents()
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
使用多线程异步调用就不会出现这样的现象了,多线程是个比较麻烦的东西,三两句说不清楚,自己找找多线程的资料看看。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询