首页 新闻 会员 周边 捐助

C# 怎么以这种方式在进程间通讯?(WPF

0
悬赏园豆:60 [已解决问题] 解决于 2016-07-01 08:59


我做的一个软件本来要开始做下载的部分了,可是我那天晚上睡觉前突然想把下载的部分独立做成一个小工具,可是我今天仔细想了一下,我应该怎么让那个小工具知道该做什么呢?
我一开始想到了cmd
我可以直接这样:download.exe url path url path url path(好像看起来有一点乱
可是这样就有两个问题了
我突然想让它再下载几个东西怎么办?(他正在下载的情况下
它下载完怎么告诉我?
然后我想到了下面这个方法:

  Process p = new Process();
            p.StartInfo.FileName = "download.exe";//其它的属性先不要管吧
            p.Start();
            p.StandardInput.WriteLine("url,path");//给它发送一条指令,让他开始下载
            p.StandardInput.WriteLine("url,path");//我突然又想让他下载其它东西了,我在给它一个指令,让它往列表里面添加一个
     //中间的代码我删掉了
            string s = p.StandardOutput.ReadToEnd();//读取它给我的回复(比如下载完成 下载失败什么的

 

这样主程序这边就没什么问题了,可是对面就有问题了
因为我想要那个分割出去的有UI 所以用了WPF
可是WPF里面 Console.WriteLine(); 好像没有用,那么我要怎么给主程序反馈信息?
而且主程序里面的: p.StandardInput.WriteLine("url,path");  我这边要怎么接收到这句呢?

FAQ

Q:为什么要这样做?直接做在主程序里面不是就好了吗

A:因为想把它做成一个独立的小工具,我可以平时直接打开cmd 输个:download XXX.XX path 就可以下载了(其实就是想偷懒,以后还需要在哪个小程序里面用到下载可以直接调用

 

ps:不需要考虑效率,稳定性,反正只传输一点点东西,而且是自己用而已

ps2:我在来问前查过一点进程间通讯的东西,不过我看了一下那几种我都不太喜欢(主要是调用起来都不方便,这个一行就可以用(虽然我不会那样做
还是比较喜欢这种方法,而且我好奇呀 那些方法有很多教你怎么使用的文章.可是这种方法我没有找到什么资料(可能是我没有很好的跟搜索引擎描述才找不到?

ps3:不要告诉我,让我直接用命名通道,socket之类的 我的目的不是快速造出一个工具,我是拿来练习的,然后顺便学一些新东西

ps4:其实我当时还想到一些其它我无法解决的问题,不过我猜查一下都可以找到答案 只有这个我找不到答案
其它的问题(顺便问一下):
1.我可不可以不用webclient?
2.我要怎么解决一些特殊的下载链接(比如磁力链接 ed2k之类的

3.Console.WriteLine();怎么样才可以在wpf中有效?

(排除掉这两个答案:debug.WriteLine();(好像是这个)

在控制台程序里面new一个WPF出来

 

ps5:其实我已经想到了解决方案,不过我还是很好奇怎么使用这种方式通讯 所以还是来问一下

ps6:刚刚学C# 很多东西不太了解

Chawol的主页 Chawol | 初学一级 | 园豆:142
提问于:2016-06-25 23:27
< >
分享
最佳答案
0

1、启动时一次性把任务都传入

2、采用进程间的通信,写个简单的wcf、socket都可以满足要求,或者用开源的框架:ICE也很简单

3、2个进程监视同一个文件内容也可以传输数据

4、利用window消息

收获园豆:60
metoer | 初学一级 |园豆:8 | 2016-06-29 11:12
其他回答(3)
1
System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.UseShellExecute = false;    //是否使用操作系统shell启动
            p.StartInfo.RedirectStandardInput = true;//接受来自调用程序的输入信息
            p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
            p.StartInfo.RedirectStandardError = true;//重定向标准错误输出
            p.StartInfo.CreateNoWindow = true;//不显示程序窗口
            p.Start();//启动程序

            //向cmd窗口发送输入信息
            p.StandardInput.WriteLine("你的命令"+ "&exit");

            p.StandardInput.AutoFlush = true;
            //p.StandardInput.WriteLine("exit");
            //向标准输入写入要执行的命令。这里使用&是批处理命令的符号,表示前面一个命令不管是否执行成功都执行后面(exit)命令,如果不执行exit命令,后面调用ReadToEnd()方法会假死
            //同类的符号还有&&和||前者表示必须前一个命令执行成功才会执行后面的命令,后者表示必须前一个命令执行失败才会执行后面的命令



            //获取cmd窗口的输出信息
            string output = p.StandardOutput.ReadToEnd();

            //StreamReader reader = p.StandardOutput;
            //string line=reader.ReadLine();
            //while (!reader.EndOfStream)
            //{
            //    str += line + "  ";
            //    line = reader.ReadLine();
            //}

            p.WaitForExit();//等待程序执行完退出进程
            p.Close();

 

刘宏玺 | 园豆:14020 (专家六级) | 2016-06-27 17:16

这答案值得给个赞

支持(0) 反对(0) vbfool | 园豆:186 (初学一级) | 2016-06-29 13:44
0

1.下载小程序  做一个队列 接受要下载的任务

2. 由于你不打算用socket webClient等方式, 那你就用这行来实现撒 string output = p.StandardOutput.ReadToEnd();

只是这个字符串内容 你要定义好 ,因为你可能有多个任务 ,每个任务要发送那些数据回来你要定义清楚

在你主程序 一直去监听这个 输出信息 ,然后解析处理  就行了

 

丶被遗忘者 | 园豆:18 (初学一级) | 2016-06-28 12:15
0

看完整个问题,为什么我的理解是你是要主程序用控制台,然后下载的小程序用WPF?正常不是下载部分是控制台然后控制的是WPF么?

vbfool | 园豆:186 (初学一级) | 2016-06-29 13:47

主程序也是WPF的(下载部分我想顺便把UI写进去所以也用WPF了)

支持(0) 反对(0) Chawol | 园豆:142 (初学一级) | 2016-07-01 08:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册