我有大约100个远程服务器,下面我试图复制一些文件 从我的电脑到所有这些远程服务器,但我想做一些检查
1-检查是否可以连接到远程服务器,如果没有,则转到下一个办公室
2 - 用于用户互动
a-我试图在datagridview1
为选定的行着色,让用户知道现在的进度和datagridview2
同样的事情,让用户知道进度是哪个文件现在在特定的办公室,但开始发送文件后界面冻结,没有交互发生怎么办?
b-如果成功,如何将成品办公室排成绿色?
更新
我使用线程来解决表单冻结,因此反馈将返回给用户 但问题没有解决,仍然发生,没有任何改变,请我该怎么做???
public void PatchUpdates()
{
try
{
foreach (DataGridViewRow OfficeListRow in DGV_OfficeList.Rows)
{
string OfficeIPAddress = OfficeListRow.Cells[2].Value.ToString();
foreach (DataGridViewRow FileListRow in DGV_FileList.Rows)
{
string SoruceFileNamePath = FileListRow.Cells[4].Value.ToString();
string DestinationFileNamePath = @"\\" + OfficeIPAddress + @"\usb1_1\test\" + Path.GetFileName(SoruceFileNamePath);
Thread foregroundthread = new Thread(() => CheckOffice(OfficeIPAddress));
foregroundthread.Start();
//check if connection to remote server is available
if (CheckOffice(OfficeIPAddress) == 1)
{
DGV_OfficeList[3, DGV_OfficeList.CurrentCell.RowIndex].Value = "Connected";
//file.copy(sorucefilenamepath, destinationfilenamepath, true); //copy files...
}
else if (CheckOffice(OfficeIPAddress) == 0)
{
DGV_OfficeList[3, DGV_OfficeList.CurrentCell.RowIndex].Value = "disconnected";
break;
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
检查连接方法
public int CheckOffice(string _ipAddress)
{
int timeout = 120;
string data = "PingTestData";
byte[] buffer = Encoding.ASCII.GetBytes(data);
Ping PingSender = new Ping();
PingOptions options = new PingOptions();
options.DontFragment = true;
PingReply reply = PingSender.Send(_ipAddress, timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
return 1;
}
else
{
return 0;
}
}
答案 0 :(得分:0)
这是很多问题,我认为将它们放在一个帖子中并不是一个好主意。但是我可以回答其中的一部分: 1-我认为你的网络检查不起作用。方法" GetIsNetworkAvailable"仅检查您的计算机是否已连接到网络。你需要了解" ping"或类似的东西(MSDN Ping class)。顺便说一句。如果您使用" return"在检测到网络故障后,您将离开该方法。使用" break"而只是留下内循环。
2-如链接File.Copy中所述,成功或抛出异常。所以描述的方式应该没问题。
3-显示使用后台工作线程(BackgroundWorker)所需的进度。
答案 1 :(得分:0)
我猜是从GUI线程调用PatchUpdates
。如果更新复制文件的循环中的DataGridViewRow.Selected
,那么GUI将永远不会反映出该更改,因为您的函数尚未返回。有几种方法可以解决它。
Application.DoEvents()
更改后致电DataGridViewRow.Selected
Control.BeginInvoke()
方法更新GUI。除此之外,您的代码中存在许多问题:
以下行不会更改,但会在循环中调用以不断检查您的网络连接是否已断开。它可能是你真正需要的东西,但它有点突出是一个错误。也许您想使用Ping
类来检查机器是否可用?
if (!System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable())
你刚刚无缘无故地切换了这个值。也许你只是想尝试调试你的解决方案。或者也许你真的希望线条闪现,但这个代码不会发生
OfficeListRow.Selected = true;
OfficeListRow.Selected = false;