Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步等待是否可以与C#中的tcp文件传输一起使用?_C#_Asynchronous_Tcp_Async Await_File Transfer - Fatal编程技术网

异步等待是否可以与C#中的tcp文件传输一起使用?

异步等待是否可以与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) {

首先,请不要评判我,我对编程相当陌生。我正在尝试制作一个PC->android应用程序,将我选择的文件发送到我的手机。它工作正常,一切正常,只是方法不是异步的。因此,如果我向手机发送内容,我的UI将冻结,直到发送完成。有人能帮我吗?我已经阅读了异步方法的所有文档,但我就是不明白,我该如何实现它

下面是一些需要的代码:

这是“发送”文件的事件,我希望它是异步的

        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) {
  ...
}