进度条假死的问题?急

yang_sy 2011-02-23 08:51:28
请大家帮我看看在提交数据的时候,数据比较大的时候会出现假死状态。我在网上查了一下,多说要使用多线程。我贴上程序麻烦高手帮忙给改改。可以不出现假死。谢谢


private void button1_Click(object sender, System.EventArgs e)
{
int i = 0;//进度条初始值
SqlConnection dbConn = new SqlConnection(sConnect);
dbConn.Open();
SqlCommand dbCmdMaxValues = new SqlCommand(MaxValues, dbConn);
string XuHao=dbCmdMaxValues.ExecuteScalar().ToString();
DataTable dt = Query(XuHao);//返回结果值
progressBar1.Maximum = dt.Rows.Count;//设置最大行数。
SqlCommand dbCmd = new SqlCommand();
foreach (DataRow row in dt.Rows)
{
string sql= @"INSERT INTO " + StationName + @"(序号,流水号)
VALUES("+Convert.ToInt32(row["序号"])+","Convert.ToString(row["流水号"])+")";
dbCmd.CommandText = sql;
dbCmd.Connection = dbConn;
dbCmd.ExecuteNonQuery();
//进度条
progressBar1.Value=i++;
}
MessageBox.Show("成功!");
dbConn.Close();
}
...全文
214 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangweiwei130 2011-02-24
  • 打赏
  • 举报
回复
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Test

{
publicclass MyProgress
{
//by 闫磊 Email:Landgis@126.com,yanleigis@21cn.com 2007.10.30
privateint MaxNum;
Form progressForm=null;
ProgressBar progressBar1=null;
bool Stop=false;
Label label1;
publicbool ProgressStep(int step)
{
if (Stop)
{
this.Dispose();
returntrue;
}
if (progressBar1.Value > progressBar1.Maximum)
{
this.Dispose();
returntrue;
}

progressBar1.Value+= step;
label1.Text = "目前完成:" + (progressBar1.Value * 100 / progressBar1.Maximum) + "%";
Application.DoEvents();

returnfalse;
}
privatevoid btn_Click(object sender, EventArgs e)
{
if (MessageBox.Show("你确定终止吗", "终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) != DialogResult.Yes)
Stop = false;
else
Stop = true;
}
public MyProgress(int Max, String Caption, bool IsCancel)//最大值和标题
{
progressForm = newForm();
progressForm.MinimizeBox = false;
progressForm.MaximizeBox = false;
progressForm.StartPosition = FormStartPosition.CenterScreen;
progressForm.Width = 326+19;
progressForm.Height = 96+19+20;
progressForm.Text= Caption;
progressForm.TopMost = true;//设置窗口在上边
label1 = new Label();
label1.Left = 9;
label1.Top = 15;
label1.Parent = progressForm;
progressBar1 = new ProgressBar();
progressBar1.Maximum = Max;
MaxNum = Max;
progressBar1.Left = 9;
progressBar1.Top = 25+15;
progressBar1.Width = 310;
progressBar1.Parent = progressForm;
progressBar1.Value = 0;

if (IsCancel)
{
Button btnCancel = new Button();
btnCancel.Text = "取消";
btnCancel.Left = 240;
btnCancel.Top = 54+20;
btnCancel.Parent = progressForm;
btnCancel.Click += new System.EventHandler(this.btn_Click);

}
progressForm.Show();

}
publicvoid Dispose()
{
if (progressForm != null)
{
progressBar1.Dispose();
progressForm.Dispose();
}
}
}
}
----------------------------------
//调用测试 进度条窗口
privatevoid button2_Click(object sender, EventArgs e)
{
MyProgress myProgress = new MyProgress(100, "进度条", true);
try
{
for (int i = 0; i < 100; i++)
{
if (myProgress.ProgressStep(1)) return;
Application.DoEvents();//让系统在百忙中抽空刷新

Thread.Sleep(100);
}
}
finally
{
myProgress.Dispose();
}
}

//--------------------------------按高手的意思修改BackgroundWorker,如下
//使用BackgroundWorker异步进度条
using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;//BackgroundWorker所在的
using System.Windows.Forms;
namespace Test
{
class MyNewProgress
{
private BackgroundWorker backgroundWorker = null;
//by 闫磊Email:Landgis@126.com,yanleigis@21cn.com 2007.10.31
privateint MaxNum;
Form progressForm = null;
ProgressBar progressBar1 = null;

Label label1;

privatevoid btn_Click(object sender, EventArgs e)
{
if (backgroundWorker.IsBusy)
{
if (MessageBox.Show("你确定终止吗", "终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
backgroundWorker.CancelAsync();
}
}
publicvoid OnProcessCompleted(object sender, EventArgs e)
{
Dispose();
}

publicvoid OnProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label1.Text = "目前完成:" + (progressBar1.Value * 100 / progressBar1.Maximum) + "%";
}
privatevoid worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
//return;

/*if (e.Cancelled)
{
MessageBox.Show("取消");
}
else if (e.Error != null)
{
MessageBox.Show("错误");
}
else
{

MessageBox.Show("完成");
}
*/
}
privatevoidForm_FormClosing(object sender, FormClosingEventArgs e) //处理窗口直接关闭事件
{
if (backgroundWorker.IsBusy)
{
if (MessageBox.Show("你确定终止吗", "终止", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
backgroundWorker.CancelAsync();
else
e.Cancel = true;
}
}

//把事件传进入
privatevoid SetbackgroundWorker(DoWorkEventHandler DoWork, ProgressChangedEventHandler worker_ProgressChanged)
{
backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerReportsProgress = true;//有进度条
backgroundWorker.WorkerSupportsCancellation = true;//是否支持异步取消
backgroundWorker.DoWork += new DoWorkEventHandler(DoWork);
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);//做的事情
backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(OnProgressChanged);//更新进度条
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);//完成事件
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(OnProcessCompleted);
backgroundWorker.RunWorkerAsync();
}
public MyNewProgress(int Max, String Caption, bool IsCancel, DoWorkEventHandler DoWork, ProgressChangedEventHandler worker_ProgressChanged)//最大值和标题
{
progressForm = newForm();
progressForm.MinimizeBox = false;
progressForm.MaximizeBox = false;
progressForm.StartPosition = FormStartPosition.CenterScreen;
progressForm.Width = 326 + 19;
progressForm.Height = 96 + 19 + 20;
progressForm.Text = Caption;
progressForm.TopMost = true;//设置窗口在上边
label1 = new Label();
label1.Left = 9;
label1.Top = 15;
label1.Parent = progressForm;
progressBar1 = new ProgressBar();
progressBar1.Maximum = Max;
MaxNum = Max;
progressBar1.Left = 9;
progressBar1.Top = 25 + 15;
progressBar1.Width = 310;
progressBar1.Parent = progressForm;
progressBar1.Value = 0;

if (IsCancel)
{
Button btnCancel = new Button();
btnCancel.Text = "取消";
btnCancel.Left = 240;
btnCancel.Top = 54 + 20;
btnCancel.Parent = progressForm;
btnCancel.Click += new System.EventHandler(this.btn_Click);

}
progressForm.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form_FormClosing);
progressForm.Show();
SetbackgroundWorker(DoWork, worker_ProgressChanged);

}
publicvoid Dispose()
{
if (progressForm != null)
{
progressBar1.Dispose();
progressForm.Dispose();
}
}
}
}
//测试方法,放一个按钮button和标签label1
privatevoid worker_DoWork(object sender, DoWorkEventArgs e)
{
DoNothing((BackgroundWorker)sender, e);
}

privatevoid DoNothing(BackgroundWorker worker, DoWorkEventArgs e)
{
//要做的事情,写在这里
int num = 100;
for (int i = 0; i <num; i++)
{
// Check for cancellation
if (worker.CancellationPending)
{
e.Cancel = true;
break;
}
else
{
worker.ReportProgress((i + 1) * (100 / num));

Thread.Sleep(100);
}
}

}

privatevoid worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
label1.Text = e.ProgressPercentage.ToString();

}
privatevoid button1_Click(object sender, EventArgs e)
{
MyNewProgress myProgress = new MyNewProgress(100, "进度条", true, worker_DoWork, worker_ProgressChanged);

}
yang_sy 2011-02-24
  • 打赏
  • 举报
回复
谢谢!测试成功
yang_sy 2011-02-24
  • 打赏
  • 举报
回复
还要问大家一个问题。下面代码已经测试成功了,但是有一个问题,就是数据库在insert 的时候总提示超时。
我是网外网插入数据的。内网测试一切正常。但是外网的时候能插入大概70多行就提示超时了。
外网的ping 值在65左右,比较平稳。

错误:
时时间已到。在操作完成之前超时时间已过或服务器未响应。
或有时出现
在从服务器接收结果时发生传输级错误。 (provider: TCP 提供程序, error: 0 - 指定的网络名不再可用。)
请问有什么好的办法吗?
注:外网为铁通光纤。传输是跨省的。


private void button1_Click(object sender, System.EventArgs e)
{
Thread thread = new Thread(InsertData);
thread.Start();
}

private void InsertData()
{
int i = 0;//进度条初始值
using( SqlConnection dbConn = new SqlConnection(sConnect) )
{
dbConn.Open();
SqlCommand dbCmdMaxValues = new SqlCommand(MaxValues, dbConn);
string XuHao = dbCmdMaxValues.ExecuteScalar().ToString();
DataTable dt = Query(XuHao);//返回结果值
//progressBar1.Maximum = dt.Rows.Count;//设置最大行数。
Action<int> setProgress1 = x => progressBar1.Maximum = x;
progressBar1.Invoke(setProgress1, dt.Rows.Count);
SqlCommand dbCmd = new SqlCommand();
Action<int> setProgress2 = x => progressBar1.Value = x;
foreach (DataRow row in dt.Rows)
{
string sql= @"INSERT INTO " + StationName + @"(序号,流水号)
VALUES("+Convert.ToInt32(row["序号"])+","Convert.ToString(row["流水号"])+")";
dbCmd.CommandText = sql;
dbCmd.Connection = dbConn;
dbCmd.ExecuteNonQuery();
//进度条
progressBar1.Invoke(setProgress2, i++);
}
MessageBox.Show("成功!");
dbConn.Close();
}
}


机器人 2011-02-23
  • 打赏
  • 举报
回复

private void button1_Click(object sender, System.EventArgs e)
{
Thread thread = new Thread(InsertData);
thread.Start();
}

private void InsertData()
{
int i = 0;//进度条初始值
using( SqlConnection dbConn = new SqlConnection(sConnect) )
{
dbConn.Open();
SqlCommand dbCmdMaxValues = new SqlCommand(MaxValues, dbConn);
string XuHao = dbCmdMaxValues.ExecuteScalar().ToString();
DataTable dt = Query(XuHao);//返回结果值
//progressBar1.Maximum = dt.Rows.Count;//设置最大行数。
Action<int> setProgress1 = x => progressBar1.Maximum = x;
progressBar1.Invoke(setProgress1, dt.Rows.Count);
SqlCommand dbCmd = new SqlCommand();
Action<int> setProgress2 = x => progressBar1.Value = x;
foreach (DataRow row in dt.Rows)
{
string sql= @"INSERT INTO " + StationName + @"(序号,流水号)
VALUES("+Convert.ToInt32(row["序号"])+","Convert.ToString(row["流水号"])+")";
dbCmd.CommandText = sql;
dbCmd.Connection = dbConn;
dbCmd.ExecuteNonQuery();
//进度条
progressBar1.Invoke(setProgress2, i++);
}
MessageBox.Show("成功!");
dbConn.Close();
}
}

yang_sy 2011-02-23
  • 打赏
  • 举报
回复
非常感谢
全栈极简 2011-02-23
  • 打赏
  • 举报
回复
1、用 backgroundworker控件,具体属性和方法请search一下,网上有很多例子
2、用Thread类开一个线程,具体操作请search一下,单线程就可以不假死。
progressBar1.Value++;//这样就可以,没必要再定义i++中间变量,节省点空间吧。
yang_sy 2011-02-23
  • 打赏
  • 举报
回复
麻烦能不能帮改一下?
SpecialName8 2011-02-23
  • 打赏
  • 举报
回复
//进度条
progressBar1.Value=i++;
Application.DoEvents()


或者用backGroundWorker 在ProgressChanged时间中改变进度条
yang_sy 2011-02-23
  • 打赏
  • 举报
回复
我是想根据准确的插入数据来显示进度条执行状态,就是插入一条数据,进度条加一。insert那部分写的有点问题,但是不耽误整体阅读,请高手见谅。
Win8的封装 用:Sc Sc封装工具简介 Sysprep Chief Executive Officer 意为系统封装首席执行官,简称Sc,由系统总裁网站(http://www.sysceo.com/)开发研制,是一款面对Windows操作系统封装的一款辅助工具,界面友好、简单易用、智能高效、自定义强,是学习研究系统封装爱好者的首选。 我的效果图: WIN 8 的驱动可以直接用:万能驱动助理 万能驱动助理(从5.25版起),WIN 7的驱动完全运行WIN 8 直接不能用,可以做一点点的修改,就完全可以了 这是WIN 7的 这样WIN8就完全支持了 最新公测版本号为:Beta1.2.0.1009 支持平台: Windows XP/2000/2003/7/2008/8 关于封装WIN8卡住不执行问题的解决办法: 这个是权限问题!请检查系统用户是否为管理员,如果是,不要,再查看一下UCA是否打开,如果打开请关闭,如果已经关闭,请在检查一下注册表[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System] "FilterAdministratorToken"=dword:00000001,把这里值改成0,再者请右击程序管理员运行! 功能简要: 五大自定义功能模块:母盘系统、工具大全、目标系统、计划任务、部署过程、封装过程。 1、母盘系统:自动智能扫描并检测当前被封装的系统状态,全面扫描系统信息、封装部署必备文件、封装部署所依赖的各大细节、系统精简等多项导致封装部署失败的文件和事项,并且提供系统修复和精简功能。 2、工具大全:提供封装相关的精品辅助软件的下载,每款软件都经过多次测试无误的精品软件,一站式封装全套软件一网打尽,并提供及时更新和测试。 3、目标系统:对部署的目标系统的强大自定义设置模块,主要设置有:常规优化、智能转移目标系统资料、智能删除部署使用过驱动包、智能转换NTFS文件系统、预制随机计算机名、智能识别笔记本并做相应处理、设置固定IP和预制随机IP、设置目标系统用户名、安装序列号等等。 4、计划任务:对部署过程提供的强大自定义外部软件和设置的接口模块、接口数量无限,提供的接口过程有5个,分别是:系统部署前、部署中、部署后、首次进系统登录时,首次进系统进桌面时;提供运行的接口类型有4种,分别是:运行软件、导入注册表、删除文件、删除文件夹;对于运行的接口方式有4种,分别是:正常运行、隐藏运行、最大化运行、最小化运行;对于运行接口完成后还提供删除接口源文件的功能,并每个接口间运行都可以自定义等待时间、不等待、等待上一个接口运行完成的模式。 5、部署过程:对部署过程的一些自定义设置模块,主要设置有:部署背景图(单张、多张轮流播放)、部署前密码验证机制、部署前安装协议机制、部署前加载usb设备驱动、激活Administrator用户、自定义部署分辨率、自定义系统部署文件颜色、自定义部署模块。 6、封装过程:对系统封装过程的一些自定义设置模块,主要设置有:自动运行Sysprep.exe进行封装、自动卸载硬件驱动、自动更改处理硬件HAL、加载扩展SRS驱动、自动保存当前系统的输入法状态、封装后锁定计算机信息防止二次修改等等。 细节亮点: 1、Sc支持系统安装意外断电续装功能(支持VISTA以下系统)。 2、Sc部署中使用快捷键Ctrl+F9可以跳过安装过程直接进入系统(支持VISTA以下系统)。 3、Sc部署中将智能处理因网卡驱动卡在部署过程的功能,此功能支持任何第三方驱动包的使用(支持VISTA以下系统)。 4、Sc部署完成后智能转移IE收藏夹和我的文档能使系统立即生效,无需重启计算机。 5、Sc部署多元化部署模块,所有模块的细节均可自定义,如字体颜色,进度条底色,高亮颜色,坐标位置等等。 6、Sc提供完善的反馈机制,SC程序自带反馈功能,可以通过文字和图片的形式反馈给我们,在部署过程中如果发生意外,SC部署程序会自动在WINDOWS文件夹下生成一个Scbug.html文件,为了不遗留文件在客户机上,该文件会在第二次重启自动删除,所以当您在首次进桌面如果发现该文件,您可以提交给我们! 配置文件: 对Sc进行设置后都会在根目录下产生一个名为Scdata.dat配置文件,为了防止破坏配置文件,对配置文件进行了加密,该配置文件只能通过运行Sc软件进行修改,配置文件自动保存最后一次设置的状态。 更新日志: 最新版本:Beta1.2.0.1009 (2012年12月17日更新) ------------------------------------ 1.2.0.1009更新列表 1、更新调用外部接口兼容问题; 2、更新部署程序; 3、新增可选自动清理多余SRS驱动选项; 历史版本更新日志: ------------------------------------ 1.2.0.1006更新列表 1、修复精简模块里WIN7下删除帮助文件导致EXPLORER结束的BUG; 2、改进精简模块里WIN7下精简%windir%\winsxs\Backup假死现象; 3、更新部署模块对没有使用SC自带SRS驱动的清理工; 4、更新部署模块绚丽进度条模式皮肤; 5、更新精简模块的部分函数; 6、更新程序图标。 1.2.0.1003更新列表 1、修复WIN8系统部署带背景的情况下,安装字体读取乱码问题; 2、优化WIN8系统封装部署模块代码; 3、更新程序图标。 Beta1.2.0.1002 ------------------------------------ 1.2.0.1002更新列表 1、调整增强键盘和鼠标驱动从SRS驱动里独立到可选项目; 2、增加赞助商地址为可选设置项目; 3、更新第二次重启的清理子程序代码,主要取消删除部署程序的库文件代码; Beta1.2.0.1001更新列表 ------------------------------------ 修复内测版本所有已知BUG。
每天,有近900万存在于互联网中的站点受到安全攻击(数据来源:Rising.com.cn),其中绝大多数网站租用虚拟主机搭建, 无权在服务器端安装专用防护软件以及进行必要的安全配置,即使站点采用独立服务器运行,目前市面上大多数杀毒软件针对恶意 脚本的查杀力度远远不够,主要针对于服务器的安全防护方面,稍微进行一些代码变形即可轻松绕过查杀。     Guardian Genius(守护精灵)由此应运而生,该程序与网站程序同样使用脚本代码编写,基于脚本语言ASP、PHP开发的能够运 行在 Windows IIS 6/7/7.5 ASP/PHP下(Linux Apache2 PHP5 的支持将视情况尽快开发完毕),无须在服务器端安装任何应用程序 。也就是说,只要您的服务器能够运行网站程序就能运行本程序。     本程序的诸多业内首创特性和特殊的针对性使之全面超越当前网络上各种安全防护产品的能力和性能。     多脚本支持:程序自带ASP/PHP双重脚本语言支持功能,运行时自动检测网站所支持的脚本类型,并且自动启用,无须用户选择 ASP/PHP版本单独下载,如若服务器同时支持ASP/PHP两种语言,程序将在登录界面提供ASP/PHP的选择,以此方便切换;同时无论切 换何种语言,均使用同一数据库。     主动防御:此功能作为本软件的重点功能被提到开发的最前沿位置!在前述各项功能在非即时状态保障网站程序不受到木马后 门等恶意代码程序威胁的同时,此主动防御功能将在您网站运行的同时时时保障您的站点安全。主动防御技术采用正则表达式进行 最精确的匹配,寻找用户提交信息中包含的各项威胁,并且由于是采用正则表达式逻辑匹配方式,因此误报几率几乎为零,匹配准 确度高达99%。截止本功能从09年3月开发完毕至今为其8个月时间,该功能核心代码经过三次修改完善,已经可以确保可以对当前国 内外任何一款公开版内部版网站漏洞扫描程序进行有效拦截,针对手工方式注入和注入代码变形绕过IDS等方式也有非常高的拦截率 ;与此同时对于程序正常使用中的各种数据提交不会产生误报,这是与当前网络上所有商业版及免费版SQL注入拦截代码(程序)最 大的不同之处。在执行效率上,测试发现对一般页面提交数据的检测只需要0.05-0.1秒左右,可以忽略不计。     变型不可绕过:我们知道,有一些正常的网站程序中一些关键代码会被杀毒软件误报,网站程序开发商的处理办法仅仅是稍微 对关键代码进行一些变形即可轻松让杀毒软件“哑口无言”,同样,木马程序经过稍微的变形也一样可以让杀毒软件“哑口无言” 。本程序利用正则表达式对代码中的关键代码变形进行特殊检测,任你怎么变形,照样可以检测出威胁,绝不“哑口无言”。仅此 一项,本程序已彰显在脚本安全领域完全超越其他杀毒软件。     扫描方式:程序可以根据用户设置针对当前网站脚本代码进行索引,然后对索引文件进行扫描,扫描过程中将与自身的木马后 门程序特征库进行比对,程序自身的特征库可随时连接中心服务器进行升级同步,以确保能够及时防御网络上最新的攻击;同时附 带的智能扫描功能不依靠特征库而采用正则泛匹配方式寻找可疑代码和其中存在的威胁。在进行大批量扫描时,大约每秒可扫描一 个文件,任意多个文件均可逐个扫描,扫描过程中可暂停扫描,随时可恢复。     队列机制:因为脚本语言的特殊性,无法做到类似应用程序(.exe程序)一样在对大量文件扫描时逐个扫描并且反馈扫描结果 ,因此目前网络任何一款Web安全扫描程序都存在对大量文件进行扫描时极度占用服务器资源,并且容易在执行过程中导致IIS进程 假死从而影响网站运行。针对此现象,本程序首创缓冲扫描机制,利用Ajax技术对文件进行队列扫描,扫描过程将逐个文件的进行 ,并且每个文件扫描完成立刻反馈扫描结果,同时在进度条上直观显示扫描进度和当前状态。经过实际测试,程序在执行扫描过程 中对于一台Inter Core 双核 2.2Ghz CPU 4G 内存的服务器所造成的CPU压力稳定在1%左右,内存占用忽略不计。     在线更新:这种只能在常规安全产品上出现的功能也首次被本程序提到Web程序层面上来;对于安全防护产品,时时更新同步网 络上的最新漏洞信息才是关键所在,一款不更新的防护产品在安全领域这个攻与防的此消彼长的战斗中将被直接淘汰,本程序的在 线更新功能将自动连接中心服务器进行最新特征库的下载更新,以确保时时让您的网站处于最新的防护当中。     数据库文件检索:由于主动防御功能的特殊性,需要对网站原有数据库连接文件进行修改,这对于一般的网站站长多有不便, 因此特开发数据库文件检索功能,当您不确定数据库文件位置时,你可以任意填写一个跟数据库有联系的脚本文件位置,程序将自 动“顺藤摸瓜”找到数据库连接文件的准确位置,并且自动修改数据库连接文件进行主动防御核心引擎的挂接工作,一些都无需用 户干预。     在线支持:由于多年处于IT业产品开发维护的最前沿,深知用户使用反馈的珍贵,以及用户的遇到问题是迫切需要解决时的焦 心情,特此开发在线支持功能,您无需登录网站、论坛、发送电子邮件等,即可将您的反馈信息在本程序中通过“支持中心”立 刻发送到官方站点支持中心等待解决。     守护精灵程序官方网站:http://www.guardiangenius.com

111,124

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧