解决方案 »
- sleep延迟问题
- sp.net SWFUpload 上传文件 报错 :服务器IO错悟 为什吗啊
- 怎样从字符串中提取cookies到cookiecollection中?
- 求带有复选框WinFrom的TreeView源代码下载
- vs2005如何添加Excel Workbook等模板
- 请问C#打印表格有什么好办法?
- spreadsheet问题
- 菜鸟求大神指导
- 如何在combobox控件中浏览选项时显示tip
- duwamish 安装问题
- winform中怎样在窗体的文字上加链接,就像qq弹出新闻消息框的新闻标题效果,点击标题可以跳转到web页面。
- 我这段代码有什么错误吗?主要是哪里? 怎么修改。 谢谢!
具体看代码
static Thread mainThread;
static Thread gprsConnectThread; [STAThread]
static void Main(string[] args)
{
mainThread = new Thread(MainThreadProc);
mainThread.Start();
mainThread.Join();
Console.WriteLine("Finished...");
Console.Read();
} static void MainThreadProc()
{
AutoResetEvent waitEvent = new AutoResetEvent(false); //开启连接线程
gprsConnectThread = new Thread(GPRSConnectThreadProc);
gprsConnectThread.Start(waitEvent); //开始加载UI
//todo
//完成UI加载 //等待连接完成
//可以直接调用gprsConnectThread.Join();
//或者等待Event通知,每隔100ms检测一次,这个While里可做一些状态更新
while (!waitEvent.WaitOne(100))
{
Console.WriteLine("Waiting...");
}
} static void GPRSConnectThreadProc(object status)
{
//消耗一下时间
for (int i = 0; i < 10; i++)
{
Thread.Sleep(1000);
} //完成通知
AutoResetEvent evt = status as AutoResetEvent;
if (evt != null)
{
evt.Set();
}
}
{
ThreadG g = new ThreadG();
g.Start();
} class ThreadG
{
Thread _threadGetGprs;
// Thread _threadGetData;
AutoResetEvent autoEvent = new AutoResetEvent(false); void GetGprsStatus()
{
while (true)
{
int SynchCount = 3;//同步数据失败尝试次数
for (int i = 1; i <= SynchCount; i++)
{
try
{
//连接Gprs
Device.EnableGsmModule();
if (Device.ConnectGprs("gprs1") == true)
{
Console.Write("连接成功");
}
}
catch (Exception ex)
{
//连接gprs失败,重试
if (i == SynchCount)//第3次失败
{
Console.Write(ex.Message);
// Alex.Utility.AppUtility.WriteLog("连接grps失败", this.GetType(), ex);
} autoEvent.WaitOne(); Console.Write(ex.Message);
}
}
_threadGetGprs.Abort(); _threadGetGprs = null;
//_threadGetGprs.Join();
}
}
public void Start()
{
if (_threadGetGprs == null)
{
_threadGetGprs = new Thread(new ThreadStart(GetGprsStatus));
_threadGetGprs.IsBackground = true;
_threadGetGprs.Start();
}
}
}
后台连接gprs写好了,下一步是同步数据。
然后
private void MainForm_Load(object sender, EventArgs e)
{
g.autoEvent = ae;
g.Start();
//接收同步消息接收数据
g.autoEvent.WaitOne()
//同步后需要做的事情
} class ThreadG
{
Thread _threadGetGprs;
// Thread _threadGetData;
AutoResetEvent autoEvent = new AutoResetEvent(false); void GetGprsStatus()
{
while (true)
{
int SynchCount = 3;//同步数据失败尝试次数
for (int i = 1; i <= SynchCount; i++)
{
try
{
//连接Gprs
Device.EnableGsmModule();
if (Device.ConnectGprs("gprs1") == true)
{
Console.Write("连接成功"); //连接成功后应该停止连接并返回同步信息
autoEvent.Set();
break;
}
}
catch (Exception ex)
{
//连接gprs失败,重试
if (i == SynchCount)//第3次失败
{
Console.Write(ex.Message);
// Alex.Utility.AppUtility.WriteLog("连接grps失败", this.GetType(), ex);
//连接失败也要返回同步信息
autoEvent.Set();
}
//autoEvent.WaitOne(); 不是用在这里 Console.Write(ex.Message);
}
}
//_threadGetGprs.Abort(); _threadGetGprs = null; 线程执行完后会自动退出,不需要手动。
//_threadGetGprs.Join();
}
}
public void Start()
{
if (_threadGetGprs == null)
{
_threadGetGprs = new Thread(new ThreadStart(GetGprsStatus));
_threadGetGprs.IsBackground = true;
_threadGetGprs.Start();
}
}
}
{
//检索未同步数据
DataSet ds = null;
//没有数据跳出循环
if (ds == null || ds.Tables == null || ds.Tables.Count <= 0)
{
return;
}
else
{
//循环读取数据
foreach (DataRow row in ds.Tables[0].Rows)
{ int SynchCount = 3;//同步数据失败尝试次数
for (int i = 1; i <= SynchCount; i++)
{
try
{
//同步数据
break;
}
catch (Exception ex)
{
//同步失败,重试
if (i == SynchCount)//第3次失败
{
//Alex.Utility.AppUtility.WriteLog("同步失败,记录ID=" + row["id"].ToString(), this.GetType(), ex);
}
}
}
}
}
}
这个是数据同步的方法。
数据库处理方面的东西我处理得少,帮不了你。
还有就是我注销登录后 也就是重新去调用ThreadG类里的start方法
界面会变得很卡了 这个怎么处理?
void GetChannelData()
{
//检索未同步数据
DataSet ds = null;
//没有数据跳出循环
if (ds == null || ds.Tables == null || ds.Tables.Count <= 0)
{
return;
}
else
{
//循环读取数据
foreach (DataRow row in ds.Tables[0].Rows)
{ int SynchCount = 3;//同步数据失败尝试次数
for (int i = 1; i <= SynchCount; i++)
{
try
{
//同步数据
break;
}
catch (Exception ex)
{
//同步失败,重试
if (i == SynchCount)//第3次失败
{
//Alex.Utility.AppUtility.WriteLog("同步失败,记录ID=" + row["id"].ToString(), this.GetType(), ex);
}
}
}
}
}
}
这是数据同步的方法,不管具体怎么实现同步,只管线程怎么跑通。