异步等待是否可以与C#中的tcp文件传输一起使用?
首先,请不要评判我,我对编程相当陌生。我正在尝试制作一个PC->android应用程序,将我选择的文件发送到我的手机。它工作正常,一切正常,只是方法不是异步的。因此,如果我向手机发送内容,我的UI将冻结,直到发送完成。有人能帮我吗?我已经阅读了异步方法的所有文档,但我就是不明白,我该如何实现它 下面是一些需要的代码: 这是“发送”文件的事件,我希望它是异步的异步等待是否可以与C#中的tcp文件传输一起使用?,c#,asynchronous,tcp,async-await,file-transfer,C#,Asynchronous,Tcp,Async Await,File Transfer,首先,请不要评判我,我对编程相当陌生。我正在尝试制作一个PC->android应用程序,将我选择的文件发送到我的手机。它工作正常,一切正常,只是方法不是异步的。因此,如果我向手机发送内容,我的UI将冻结,直到发送完成。有人能帮我吗?我已经阅读了异步方法的所有文档,但我就是不明白,我该如何实现它 下面是一些需要的代码: 这是“发送”文件的事件,我希望它是异步的 private void button2_Click(object sender, EventArgs e) {
private void button2_Click(object sender, EventArgs e) {
await push();
}
public async Task push() {
if (folder != null) {
string ip = textBox1.Text + "." + textBox2.Text + "." + textBox3.Text + "." + textBox4.Text;
listBox1.Items.Add("Creating a test server on the machine on port " + 8001 + ". Host ip: " + ip);
server = new Server(ip, 8001);
listBox1.Items.Add("Server running.");
int i = 0;
listBox1.Items.Add("Fetching files...");
getFileNum(folder, ref i);
listBox1.Items.Add("Files scanned. Current number: " + i + " files.");
//send number of files to be transmitted
listBox1.Items.Add("Getting your files ready... please standby.");
server.send(i.ToString());
listBox1.Items.Add("Your files are ready, beggining the transmitting process.");
//actual method for sending files
sendFiles(folder);
listBox1.Items.Add(".");
listBox1.Items.Add(".");
listBox1.Items.Add("Files sent!");
}
else {
MessageBox.Show("No directory path selected.", "Error_null_path");
}
}
public async Task<Task> sendFiles(DirectoryInfo dir) {
FileInfo[] files = dir.GetFiles();
DirectoryInfo[] dirs = dir.GetDirectories();
string path = dir.FullName + "/";
foreach (FileInfo file in files) {
await server.sendFile(path + file.Name, folder.FullName.Replace(folder.Name,""));
listBox1.Items.Add("Sent file: " + file.Name);
}
foreach (DirectoryInfo subDir in dirs) {
await sendFiles(subDir);
}
return null;
}
private void按钮2\u单击(对象发送者,事件参数e){
等待推送();
}
公共异步任务推送(){
如果(文件夹!=null){
字符串ip=textBox1.Text+“+textBox2.Text+”+textBox3.Text+“+textBox4.Text;
listBox1.Items.Add(“在端口“+8001+”上的计算机上创建测试服务器。主机ip:+ip”);
服务器=新服务器(ip,8001);
listBox1.Items.Add(“正在运行的服务器”);
int i=0;
listBox1.Items.Add(“获取文件…”);
getFileNum(文件夹,参考i);
listBox1.Items.Add(“已扫描的文件。当前编号:“+i+”文件”);
//发送要传输的文件数
listBox1.Items.Add(“准备好文件…请待机”);
send(i.ToString());
listBox1.Items.Add(“您的文件已准备就绪,正在传输过程中。”);
//发送文件的实际方法
发送文件(文件夹);
列表框1.项目。添加(“.”);
列表框1.项目。添加(“.”);
listBox1.Items.Add(“文件已发送!”);
}
否则{
Show(“未选择目录路径。”,“错误\u空\u路径”);
}
}
公共异步任务发送文件(目录信息目录){
FileInfo[]files=dir.GetFiles();
DirectoryInfo[]dirs=dir.GetDirectories();
字符串路径=dir.FullName+“/”;
foreach(文件中的文件信息文件){
等待server.sendFile(path+file.Name,folder.FullName.Replace(folder.Name,”);
listBox1.Items.Add(“已发送文件:“+file.Name”);
}
foreach(目录中的目录信息子目录){
等待发送文件(subDir);
}
返回null;
}
这是“服务器”类中代码的发送部分:
公共异步任务sendFile(字符串文件路径,字符串根){
FileInfo file=新的FileInfo(filePath);
套接字服务器=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
Bind(新的IPEndPoint(IPAddress.Parse(ip),port));
//发送歌曲名称长度
监听(0);
Socket client=server.Accept();
字节[]发送;
if(filePath.Replace(根“”)。长度<10)
send=new UTF8Encoding(true).GetBytes(“0”+filePath.Replace(root)”.Length);
其他的
send=new UTF8Encoding(true).GetBytes(filePath.Replace(root)(“”).Length.ToString());
client.Send(发送);
client.Close();
server.Close();
//发送歌曲名称
服务器=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
Bind(新的IPEndPoint(IPAddress.Parse(ip),port));
监听(0);
client=server.Accept();
send=newutf8encoding(true).GetBytes(filePath.Replace(root)”);
client.Send(发送);
client.Close();
server.Close();
//发送歌曲
服务器=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
Bind(新的IPEndPoint(IPAddress.Parse(ip),port));
监听(0);
client=server.Accept();
client.SendFile(file.FullName);
client.Close();
server.Close();
//返回null;
}
公共异步任务发送(字符串数据){
开关(数据长度){
案例1:
data=“000”+数据;
打破
案例2:
data=“00”+数据;
打破
案例3:
data=“0”+数据;
打破
违约:
data=“0000”;
打破
}
套接字服务器=新套接字(AddressFamily.InterNetwork、SocketType.Stream、ProtocolType.Tcp);
Bind(新的IPEndPoint(IPAddress.Parse(ip),port));
监听(0);
Socket client=server.Accept();
字节[]发送=新的UTF8Encoding(true).GetBytes(数据);
client.Send(发送);
client.Close();
server.Close();
//返回null;
}
我对编程相当陌生
提示:请注意编译器警告。他们会指出非常有用的东西。与此代码类似,将出现一个编译器警告,告诉您已将方法标记为async,但它将同步运行
TCP/IP套接字对于初学者来说非常复杂。见鬼,对于高级开发人员来说,它们非常复杂。异步代码也很复杂,异步套接字是一场复杂的风暴
因此,对于您的情况,因为您已经有了一个解决方案,所以我建议使用Task.Run
将您现有的同步代码推送到线程池线程。这是UI应用程序可以接受的模式,但您不希望对任何类型的服务器应用程序(例如ASP.NET)执行此操作
公共异步任务推送(){
...
var progress=newprogress(报告=>listBox1.Items.Add(报告));
等待
public async Task sendFile(string filePath, string root) {
FileInfo file = new FileInfo(filePath);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Parse(ip), port));
//send song name length
server.Listen(0);
Socket client = server.Accept();
byte[] send;
if (filePath.Replace(root, "").Length < 10)
send = new UTF8Encoding(true).GetBytes("0" + filePath.Replace(root, "").Length);
else
send = new UTF8Encoding(true).GetBytes(filePath.Replace(root, "").Length.ToString());
client.Send(send);
client.Close();
server.Close();
//send song name
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Parse(ip), port));
server.Listen(0);
client = server.Accept();
send = new UTF8Encoding(true).GetBytes(filePath.Replace(root,""));
client.Send(send);
client.Close();
server.Close();
//send the song
server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Parse(ip), port));
server.Listen(0);
client = server.Accept();
client.SendFile(file.FullName);
client.Close();
server.Close();
//return null;
}
public async Task send(string data) {
switch (data.Length) {
case 1:
data = "000" + data;
break;
case 2:
data = "00" + data;
break;
case 3:
data = "0" + data;
break;
default:
data = "0000";
break;
}
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Parse(ip), port));
server.Listen(0);
Socket client = server.Accept();
byte[] send = new UTF8Encoding(true).GetBytes(data);
client.Send(send);
client.Close();
server.Close();
//return null;
}
public async Task push() {
...
var progress = new Progress<string>(report => listBox1.Items.Add(report));
await Task.Run(() => sendFiles(folder, progress));
listBox1.Items.Add(".");
listBox1.Items.Add(".");
listBox1.Items.Add("Files sent!");
...
}
public void sendFiles(DirectoryInfo dir, IProgress<string> progress) {
...
foreach (FileInfo file in files) {
server.sendFile(path + file.Name, folder.FullName.Replace(folder.Name,""));
progress?.Report("Sent file: " + file.Name);
}
foreach (DirectoryInfo subDir in dirs) {
sendFiles(subDir);
}
}
public void sendFile(string filePath, string root) {
...
}