none
Silverlight3中通过SaveFileDialog保存文件时,如何添加一个进度条? RRS feed

答案

  • 还是不明白。我的程序里现在就用着进度条和SaveFileDialog,是VB写的。

    Private DownSave As New SaveFileDialog
    Private WithEvents DownClient As New WebClient

    Private Sub Down()
        If DownSave.ShowDialog = True Then
            DownClient.OpenReadAsync(New Uri("ABC.zip", UriKind.Relative))
        End If
    End Sub

    Private Sub DownClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles DownClient.DownloadProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub DownClient_OpenReadCompleted(ByVal sender As Object, ByVal e As System.Net.OpenReadCompletedEventArgs) Handles DownClient.OpenReadCompleted
        Dim Bytes As Byte() = New Byte(e.Result.Length - 1) {}
        e.Result.Read(Bytes, 0, e.Result.Length)
        DownSave.OpenFile.Write(Bytes, 0, e.Result.Length)
        e.Result.Close()
    End Sub

    一切都挺正常,没发现有什么问题,也没发现那个进度条与SaveFileDialog之间有什么关系。

    C#(自动翻译的,不一定正确):
    private SaveFileDialog DownSave = new SaveFileDialog();
    private WebClient DownClient = new WebClient();

    private void Down()
    {
        if (DownSave.ShowDialog == true) {
            DownClient.OpenReadAsync(new Uri("ABC.zip", UriKind.Relative));
            DownClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Down1);
            DownClient.OpenReadCompleted += new OpenReadCompletedEventHandler(Down2);
        }
    }

    private void Down1(object sender, DownloadProgressChangedEventArgs e)
    {
        ProgressBar1.Value = e.ProgressPercentage;
    }

    private void Down2(object sender, OpenReadCompletedEventArgs e)
    {
        byte[] Bytes = new byte[e.Result.Length];
        e.Result.Read(Bytes, 0, e.Result.Length);
        DownSave.OpenFile.Write(Bytes, 0, e.Result.Length);
        e.Result.Close();
    }

    2009年8月21日 6:18
  • 这只是一个示例,你可以按照这个思路
    1)传递下载文件的有关参数,服务器端对参数进行解析,发送不同文件的内容。
    2)为了方便,采用了WebClient的DownloadString方法,考虑到文件大小,可采用其他方法。

    示例
    1)客户端文件

    1.1)Page.xaml

    <UserControl x:Class="SLDownloadProgressTest.Page"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 Width="400"
                 Height="300">
        <Grid x:Name="LayoutRoot"
              Background="White">
            <StackPanel Orientation="Vertical"
                        Margin="20 20 20 20">
                <Button x:Name="BtnDowload"
                        Content="Please Click Here To Download"></Button>
                <Image Height="20"></Image>
                <TextBlock Text="Download Progress Bar"></TextBlock>
                <ProgressBar x:Name="PrbDownload"
                             Height="24"></ProgressBar>
                <TextBlock x:Name="TxtDownloadMsg"
                           Text=""></TextBlock>
            </StackPanel>
        </Grid>
    </UserControl>



    1.2)Page.xaml.cs

    using System;
    using System.IO;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;

    namespace SLDownloadProgressTest {
        public partial class Page : UserControl {
            public Page() {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(Page_Loaded);
            }
            void Page_Loaded(object sender, RoutedEventArgs e) {
                BtnDowload.Click += new RoutedEventHandler(BtnDowload_Click);
                PrbDownload.Minimum = 0; PrbDownload.Maximum = 100; PrbDownload.Value = 0;
            }
            void BtnDowload_Click(object sender, RoutedEventArgs e) {
                DownLoadFileStart();
            }
            private Stream FileDownLoadStream;
            void DownLoadFileStart() {
                var DlgFileSaveTo = new SaveFileDialog();
                DlgFileSaveTo.Filter = "All Files(*.*)|*.*";
                if ((Boolean)DlgFileSaveTo.ShowDialog()) {
                    FileDownLoadStream = DlgFileSaveTo.OpenFile(); DownloadFileProc();
                }
            }
            void DownloadFileProc() {
                PrbDownload.Value = 0; TxtDownloadMsg.Text = "Start Download";
                var WcUrlStr = "/HrDownLoadFile.ashx";
                var WcReq = new WebClient();
                WcReq.DownloadProgressChanged += new DownloadProgressChangedEventHandler(WcReq_DownloadProgressChanged);
                WcReq.DownloadStringCompleted += new DownloadStringCompletedEventHandler(WcReq_DownloadStringCompleted);
                WcReq.DownloadStringAsync(new Uri(WcUrlStr, UriKind.Relative), null);
            }
            void WcReq_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
                PrbDownload.Value = e.ProgressPercentage;
            }
            void WcReq_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) {
                var ReceivedFileStrB64 = e.Result;
                var ReceivedFileBuf = Convert.FromBase64String(ReceivedFileStrB64);
                FileDownLoadStream.Write(ReceivedFileBuf, 0, ReceivedFileBuf.Length);
                FileDownLoadStream.Close(); FileDownLoadStream.Dispose(); FileDownLoadStream = null;
                PrbDownload.Value = 100; TxtDownloadMsg.Text = "Download End";
            }
        }
    }

    2)服务器端文件
    2.1) HrDownloadFile.ashx

    using System;
    using System.Web;

    namespace SLDownloadProgressTest.Web {

        public class HrDownloadFile : IHttpHandler {

            public void ProcessRequest(HttpContext context) {
                var FileName = "Silverlight.js";
                context.Response.ContentType = "text/plain";
                var FileBuf = System.IO.File.ReadAllBytes(context.Server.MapPath(FileName));
                var FileStrB64 = Convert.ToBase64String(FileBuf);
                context.Response.Write(FileStrB64);
            }

            public bool IsReusable {
                get {
                    return false;
                }
            }
        }
    }

    2009年8月21日 3:24

全部回复

  • SaveFileDialog只是个用来选择保存文件路径的对话框,这个是一瞬间完成的事情,怎么可能会有进度条呢?没太理解你的意思,是不是想问下载文件或是上传文件?
    2009年8月20日 10:50
  • 人家肯定是问:
    SaveFileDialog进度条,我想提问人是问在打开后下载服务器东西的并且存入FileSaveDialog指定的文件时候做进度条。我觉得也有点难度(要打开在前,下载在后,怎么龙好????,如果只是做下载东西的进度条那就太简单了,人家也不会文这样的弱智问题)。
    • 已编辑 TFSoft 2009年8月20日 14:21
    2009年8月20日 14:17
  • 还是没太明白,先后有什么区别呢?如果是下载或上传的进度,那就在文件下载或上传过程中显示一个进度不就行了么,这和SaveFileDialog对话框以及什么时候打开有什么关系呢?SaveFileDialog不就只负责选择路径么,与进度有什么关系呢?
    2009年8月20日 17:03
  •     怎么还不明白;人家要实现的效果很明显,那就是:点击文件保存对话框后,弹出文件对话框,选择文件,然后下载服务器断数据(这时显示进度条),下载完毕,保存文件到客户指定的位置。
        这里有个问题是,那个SaveFileDialog的Stream怎么与SL提供的异步下载发生关系。如果两者,好建立关系,进度条就好办!
        我想楼主就是问这个问题。
    2009年8月20日 23:40
  • TFSoft 用户奖牌用户奖牌用户奖牌用户奖牌:
               你真是太懂我的心了!!因为我想下载文件到本地任意路径,所以想通过"SaveFileDialog"来选择一个本地路径,然后将服务器端数据已流的方式写入到本地!所以现在差一个进度条!
    2009年8月21日 1:12
  • 我正在作这个完整的示例给你,请等待!

    2009年8月21日 2:24
  • 这只是一个示例,你可以按照这个思路
    1)传递下载文件的有关参数,服务器端对参数进行解析,发送不同文件的内容。
    2)为了方便,采用了WebClient的DownloadString方法,考虑到文件大小,可采用其他方法。

    示例
    1)客户端文件

    1.1)Page.xaml

    <UserControl x:Class="SLDownloadProgressTest.Page"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 Width="400"
                 Height="300">
        <Grid x:Name="LayoutRoot"
              Background="White">
            <StackPanel Orientation="Vertical"
                        Margin="20 20 20 20">
                <Button x:Name="BtnDowload"
                        Content="Please Click Here To Download"></Button>
                <Image Height="20"></Image>
                <TextBlock Text="Download Progress Bar"></TextBlock>
                <ProgressBar x:Name="PrbDownload"
                             Height="24"></ProgressBar>
                <TextBlock x:Name="TxtDownloadMsg"
                           Text=""></TextBlock>
            </StackPanel>
        </Grid>
    </UserControl>



    1.2)Page.xaml.cs

    using System;
    using System.IO;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;

    namespace SLDownloadProgressTest {
        public partial class Page : UserControl {
            public Page() {
                InitializeComponent();
                this.Loaded += new RoutedEventHandler(Page_Loaded);
            }
            void Page_Loaded(object sender, RoutedEventArgs e) {
                BtnDowload.Click += new RoutedEventHandler(BtnDowload_Click);
                PrbDownload.Minimum = 0; PrbDownload.Maximum = 100; PrbDownload.Value = 0;
            }
            void BtnDowload_Click(object sender, RoutedEventArgs e) {
                DownLoadFileStart();
            }
            private Stream FileDownLoadStream;
            void DownLoadFileStart() {
                var DlgFileSaveTo = new SaveFileDialog();
                DlgFileSaveTo.Filter = "All Files(*.*)|*.*";
                if ((Boolean)DlgFileSaveTo.ShowDialog()) {
                    FileDownLoadStream = DlgFileSaveTo.OpenFile(); DownloadFileProc();
                }
            }
            void DownloadFileProc() {
                PrbDownload.Value = 0; TxtDownloadMsg.Text = "Start Download";
                var WcUrlStr = "/HrDownLoadFile.ashx";
                var WcReq = new WebClient();
                WcReq.DownloadProgressChanged += new DownloadProgressChangedEventHandler(WcReq_DownloadProgressChanged);
                WcReq.DownloadStringCompleted += new DownloadStringCompletedEventHandler(WcReq_DownloadStringCompleted);
                WcReq.DownloadStringAsync(new Uri(WcUrlStr, UriKind.Relative), null);
            }
            void WcReq_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) {
                PrbDownload.Value = e.ProgressPercentage;
            }
            void WcReq_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) {
                var ReceivedFileStrB64 = e.Result;
                var ReceivedFileBuf = Convert.FromBase64String(ReceivedFileStrB64);
                FileDownLoadStream.Write(ReceivedFileBuf, 0, ReceivedFileBuf.Length);
                FileDownLoadStream.Close(); FileDownLoadStream.Dispose(); FileDownLoadStream = null;
                PrbDownload.Value = 100; TxtDownloadMsg.Text = "Download End";
            }
        }
    }

    2)服务器端文件
    2.1) HrDownloadFile.ashx

    using System;
    using System.Web;

    namespace SLDownloadProgressTest.Web {

        public class HrDownloadFile : IHttpHandler {

            public void ProcessRequest(HttpContext context) {
                var FileName = "Silverlight.js";
                context.Response.ContentType = "text/plain";
                var FileBuf = System.IO.File.ReadAllBytes(context.Server.MapPath(FileName));
                var FileStrB64 = Convert.ToBase64String(FileBuf);
                context.Response.Write(FileStrB64);
            }

            public bool IsReusable {
                get {
                    return false;
                }
            }
        }
    }

    2009年8月21日 3:24
  • 还是不明白。我的程序里现在就用着进度条和SaveFileDialog,是VB写的。

    Private DownSave As New SaveFileDialog
    Private WithEvents DownClient As New WebClient

    Private Sub Down()
        If DownSave.ShowDialog = True Then
            DownClient.OpenReadAsync(New Uri("ABC.zip", UriKind.Relative))
        End If
    End Sub

    Private Sub DownClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles DownClient.DownloadProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    Private Sub DownClient_OpenReadCompleted(ByVal sender As Object, ByVal e As System.Net.OpenReadCompletedEventArgs) Handles DownClient.OpenReadCompleted
        Dim Bytes As Byte() = New Byte(e.Result.Length - 1) {}
        e.Result.Read(Bytes, 0, e.Result.Length)
        DownSave.OpenFile.Write(Bytes, 0, e.Result.Length)
        e.Result.Close()
    End Sub

    一切都挺正常,没发现有什么问题,也没发现那个进度条与SaveFileDialog之间有什么关系。

    C#(自动翻译的,不一定正确):
    private SaveFileDialog DownSave = new SaveFileDialog();
    private WebClient DownClient = new WebClient();

    private void Down()
    {
        if (DownSave.ShowDialog == true) {
            DownClient.OpenReadAsync(new Uri("ABC.zip", UriKind.Relative));
            DownClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Down1);
            DownClient.OpenReadCompleted += new OpenReadCompletedEventHandler(Down2);
        }
    }

    private void Down1(object sender, DownloadProgressChangedEventArgs e)
    {
        ProgressBar1.Value = e.ProgressPercentage;
    }

    private void Down2(object sender, OpenReadCompletedEventArgs e)
    {
        byte[] Bytes = new byte[e.Result.Length];
        e.Result.Read(Bytes, 0, e.Result.Length);
        DownSave.OpenFile.Write(Bytes, 0, e.Result.Length);
        e.Result.Close();
    }

    2009年8月21日 6:18
  • 怎么没关系呢,是有关系,因为是异步。

    Private Sub DownClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles DownClient.DownloadProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub

    这里就是关系亚!

    和我给你的例子基本一样。
    我以前用VB.net,最近才转C#,因为网上的人都喜欢C#。其实目前VB.net 比C#来得方便。
    也许那些人认为C#显得水平高点。其实vb.net已经发展到9.0了,c#才3.0,VB.net比C#好用多了。
    c#能搞的,vb.net一定能搞。vb.net的能搞的,c#搞起来就不方便。
    只有极个别C#可以搞的,vb.net不方便搞。

    2009年8月21日 6:35
  • 这个DownloadProgressChanged是WebClient的事件,与SaveFileDialog之间一点关系也没有。使不使用SaveFileDialog,对DownloadProgressChanged毫无影响。SaveFileDialog唯一的作用就是指定路径。那些进度全都是由WebClirnt控制的,是用来显示上下载的进度的,绝对与SaveFileDialog没有任何关系,这点我可以保证。
    2009年8月21日 7:01
  • 绝对有关系,你要明白!
    1)DownSave 打开的是一个流,也就是你的文件内容要存入的流,留再流到文件里面去。
    2)DownClient获取一个流,获取的流,逐步写入到,你那个DownSave的流里面去。
    3)DownClient流的变化(进度),其实就是DownSave 流的变化。这两个流是同步的。
    你说能没关系?我不知道你们是否喜欢写代码!反正是有关系的。

    • 已编辑 TFSoft 2009年8月21日 8:15
    2009年8月21日 8:12
  • 人家肯定是问:
    SaveFileDialog进度条,我想提问人是问在打开后下载服务器东西的并且存入FileSaveDialog指定的文件时候做进度条。我觉得也有点难度(要打开在前,下载在后,怎么龙好????,如果只是做下载东西的进度条那就太简单了,人家也不会文这样的弱智问题)。。

    怎么还不明白;人家要实现的效果很明显,那就是:点击文件保存对话框后,弹出文件对话框,选择文件,然后下载服务器断数据(这时显示进度条),下载完毕,保存文件到客户指定的位置。
    这里有个问题是,那个SaveFileDialog的Stream怎么与SL提供的异步下载发生关系。如果两者,好建立关系,进度条就好办!
    我想楼主就是问这个问题。

    绝对有关系,你要明白!
    1)DownSave 打开的是一个流,也就是你的文件内容要存入的流,留再流到文件里面去。
    2)DownClient获取一个流,获取的流,逐步写入到,你那个DownSave的流里面去。
    3)DownClient流的变化(进度),其实就是DownSave 流的变化。这两个流是同步的。
    你说能没关系?我不知道你们是否喜欢写代码!反正是有关系的。
    说实话你这几个帖子我都没看懂。第一个帖子里的有难度、太简单、弱智问题分别指什么?第二个帖子里的SaveFileDialog的Stream怎么与SL提供的异步下载发生关系是什么意思?第三个帖子里谁跟谁同步,怎么个逐步写入再流到文件,实在搞不清你说的是什么意思啊?

    总之我的想法就是:

    ---------- VB ----------
     
    Private DownSave As New SaveFileDialog
    Private WithEvents DownClient As New WebClient
    
    Private Sub Down()
        If DownSave.ShowDialog = True Then
            DownClient.OpenReadAsync(New Uri("ABC.zip", UriKind.Relative))
        End If
    End Sub
    
    Private Sub DownClient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles DownClient.DownloadProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
    End Sub
    
    Private Sub DownClient_OpenReadCompleted(ByVal sender As Object, ByVal e As System.Net.OpenReadCompletedEventArgs) Handles DownClient.OpenReadCompleted
        Dim Bytes As Byte() = New Byte(e.Result.Length - 1) {}
        e.Result.Read(Bytes, 0, e.Result.Length)
        DownSave.OpenFile.Write(Bytes, 0, e.Result.Length)
        e.Result.Close()
    End Sub

    ---------- C# ----------

    private SaveFileDialog DownSave = new SaveFileDialog();
    private WebClient DownClient = new WebClient();
    
    private void Down()
    {
        if (DownSave.ShowDialog == true) {
            DownClient.OpenReadAsync(new Uri("ABC.zip", UriKind.Relative));
            DownClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Down1);
            DownClient.OpenReadCompleted += new OpenReadCompletedEventHandler(Down2);
        }
    }
    
    private void Down1(object sender, DownloadProgressChangedEventArgs e)
    {
        ProgressBar1.Value = e.ProgressPercentage;
    }
    
    private void Down2(object sender, OpenReadCompletedEventArgs e)
    {
        byte[] Bytes = new byte[e.Result.Length];
        e.Result.Read(Bytes, 0, e.Result.Length);
        DownSave.OpenFile.Write(Bytes, 0, e.Result.Length);
        e.Result.Close();
    }
    这就是我的解决方案,别的不清楚。
    2009年8月21日 9:31
  • 你的代码是正确的,就不知道你是否真正理解了两个流之间的关系。
    you code is perfect right. but i dont know if you fully understand the relation between the two streams.

    2009年8月21日 13:21
  • 你的代码是正确的,就不知道你是否真正理解了两个流之间的关系。
    you code is perfect right. but i dont know if you fully understand the relation between the two streams.


    两个流???指什么啊
    2009年8月21日 13:33
  • 一个是对话框的文件流,一个是服务器发出的数据流。
    one stream is the savefiledialog stream. the other is the stream from server.
    2009年8月21日 13:38
  • 一个是对话框的文件流,一个是服务器发出的数据流。
    one stream is the savefiledialog stream. the other is the stream from server.

    无语 服了你  我没话可说 请另高人来解释
    2009年8月21日 13:41
  •  DownClient.OpenReadAsync(new Uri("ABC.zip", UriKind.Relative));
    最好放
     DownClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Down1);
            DownClient.OpenReadCompleted += new OpenReadCompletedEventHandler(Down2);
    两行的下面
    这样比较正规
    2009年8月21日 13:45
  •  DownClient.OpenReadAsync(new Uri("ABC.zip", UriKind.Relative));
    最好放
     DownClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Down1);
            DownClient.OpenReadCompleted += new OpenReadCompletedEventHandler(Down2);
    两行的下面
    这样比较正规

    这个世界上没有什么正规不正规的  只有合适自己方式 你觉得你自己方式好 不必要强调让别人用你的方式
    佩服你研究细节精神  不过在意细节过多 会把自己搞得心里不舒服 注意点
    2009年8月21日 13:52
  • coding must be in order.  we all should write uderstandable code, good structured code.
    if you were my student. hehe......
    2009年8月21日 13:54
  • 呵呵 比起标准正规  我更喜欢自己风格方式 更直接当我自己的正规 我从不记那些书呆子什么标准规范
    2009年8月21日 14:01
  • 我干脆把这个问题描述清楚:

    1)DownSave 文件对话框打开后,触发了DownClient 异步下载事件的开始。
    2)DownClient 开始异步下载,比响应进度变化。
    3)DownClient 异步下载结束,将获得的数据存入DownSave打开的文件流。
    这样其实就是实现了进度条。

    我是从DOS开始搞通讯编程序。那时候没有任何类给你调用,全部自己写,包括数据校验、通讯协议等。
    现在好了,什么都是控件,太方便了。不过如果控件没有的功能,也就没有办法了。
    2009年8月21日 14:11
  • 要我告诉你为什么要把那一行写在那两行下面的道理不?一般情况下,你那样写也不会发生问题,特殊情况下,你的代码就好讨厌!
    2009年8月21日 14:23
  • 要我告诉你为什么要把那一行写在那两行下面的道理不?一般情况下,你那样写也不会发生问题,特殊情况下,你的代码就好讨厌!

    呵呵 你说的都对 你坚持你的想法就行了
    2009年8月21日 14:26
  • 我好人做到底,目的是为了大家以后尽量心细点,程序少点Bug。
    为什么呢?
    1)其实你创建DownClient 后,没有立即告诉它该绑定哪些事件,这时你就调用他的下载(OpenReadAsync)方法,试问:因为是异步,DownClient肯定马上开始执行, 如果由于计算机操作系统的原因,中断调度发生了一些特殊情况,可能还等不及执行下面两行事件绑定代码执行,或者,可能先就执行完了下载的东西。那么你的DownloadProgressChanged 就得不到响应,甚至DownloadProgressChanged 事件可能会得不到响应。
    2)这就是为什么我建议你要把那一行写在那两行代码的下面的道理。你一定是新一带程序员,用惯了控件。不像老程序员那么死板。
    3)当然就相隔一行代码,那种机会几乎可以忽略不计。你的程序一样OK。但是总是不舒服。

    • 已编辑 TFSoft 2009年8月21日 14:39
    2009年8月21日 14:37
  • 我好人做到底,目的是为了大家以后尽量心细点,程序少点Bug。
    为什么呢?
    1)其实你创建DownClient 后,没有立即告诉它该绑定哪些事件,这时你就调用他的下载(OpenReadAsync)方法,试问:因为是异步,DownClient肯定马上开始执行, 如果由于计算机操作中断调度发生了一些特殊情况,可能还等不及执行下面两行事件绑定代码执行,或者,可能先就执行完了下载的东西。那么你的DownloadProgressChanged 就得不到响应,甚至DownloadProgressChanged 事件可能会得不到响应。
    2)这就是为什么我建议你要把那一行写在那两行代码的下面的道理。你一定是新一带程序员,用惯了控件。不像老程序员那么死板。


    我不赞成你这个建议
    控件是提高开发效率的 你搞清楚现在工作 环境 和以前不一样 以前多个人干一件事工作 现在一个人干多件事工作  那效率多低
    我告诉你 真正高手 不是写的正规越好 也不是只写代码  是写的简洁 用最少代码解决最大问题 保持思路清楚 控件像重用组件一样 现在为什么给编程带来控件 我告诉你 以前的问题和需求 到处都有 我们面对未来发展需求问题 解决现在现实需求问题 我们浪费在旧时代写那些都写过了的时间 没意义  随时间发展需求越高 我们能一点一滴写吗? 你看看微软的系统 以前的系统用了几千人写的   现在的系统用了十几万人写的 这就是差距 你写代码有多好还是解决不了问题 没意义的
    2009年8月21日 14:51
  • 我好人做到底,目的是为了大家以后尽量心细点,程序少点Bug。
    为什么呢?
    1)其实你创建DownClient 后,没有立即告诉它该绑定哪些事件,这时你就调用他的下载(OpenReadAsync)方法,试问:因为是异步,DownClient肯定马上开始执行, 如果由于计算机操作系统的原因,中断调度发生了一些特殊情况,可能还等不及执行下面两行事件绑定代码执行,或者,可能先就执行完了下载的东西。那么你的DownloadProgressChanged 就得不到响应,甚至DownloadProgressChanged 事件可能会得不到响应。
    2)这就是为什么我建议你要把那一行写在那两行代码的下面的道理。你一定是新一带程序员,用惯了控件。不像老程序员那么死板。
    3)当然就相隔一行代码,那种机会几乎可以忽略不计。你的程序一样OK。但是总是不舒服。


    细心过头 会得心理病的 很难控制 到处在意什么 对自己心理影响很大 
    任何程序不可能没有bug  顶级程序员还犯小错呢 错误免不了
    2009年8月21日 15:04
  •  DownClient.OpenReadAsync(new Uri("ABC.zip", UriKind.Relative));
    最好放
     DownClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(Down1);
            DownClient.OpenReadCompleted += new OpenReadCompletedEventHandler(Down2);
    两行的下面
    这样比较正规

    我不是很懂C#,我写的是VB程序,这个是自动翻译出来的,该在上还是该在下,我完全搞不清。我回答的时候特别提到了我用的是VB,所有C#都不能保证其正确性。因此请以VB为准。


    coding must be in order.  we all should write uderstandable code, good structured code.
    if you were my student. hehe......

    老大哥,我劝你别再用英语了,你写的所有英语内容都叫人很难理解。另外你强调的代码要尽量的有条理,尽量完美是对的,不过没必要苛求。

    我干脆把这个问题描述清楚:

    1)DownSave 文件对话框打开后,触发了DownClient 异步下载事件的开始。
    2)DownClient 开始异步下载,比响应进度变化。
    3)DownClient 异步下载结束,将获得的数据存入DownSave打开的文件流。
    这样其实就是实现了进度条。

    我是从DOS开始搞通讯编程序。那时候没有任何类给你调用,全部自己写,包括数据校验、通讯协议等。
    现在好了,什么都是控件,太方便了。不过如果控件没有的功能,也就没有办法了。

    现在不是什么都控件,而是什么都对象。DOS我也搞过的,但那已经过去了,不值得炫耀,也算不上是什么经验,要说有什么是基础的话,数学思维是唯一的基础。毕竟一个优秀的程序员应该是问题解决的高手,算法上的高手,而不是代码写手。

    好人做到底,目的是为了大家以后尽量心细点,程序少点Bug。
    为什么呢?
    1)其实你创建DownClient 后,没有立即告诉它该绑定哪些事件,这时你就调用他的下载(OpenReadAsync)方法,试问:因为是异步,DownClient肯定马上开始执行, 如果由于计算机操作系统的原因,中断调度发生了一些特殊情况,可能还等不及执行下面两行事件绑定代码执行,或者,可能先就执行完了下载的东西。那么你的DownloadProgressChanged 就得不到响应,甚至DownloadProgressChanged 事件可能会得不到响应。
    2)这就是为什么我建议你要把那一行写在那两行代码的下面的道理。你一定是新一带程序员,用惯了控件。不像老程序员那么死板。
    3)当然就相隔一行代码,那种机会几乎可以忽略不计。你的程序一样OK。但是总是不舒服。

    我觉得现在的年轻一代的程序员才是高手,因为他们头脑灵活,很擅长框架外思考,有创造力,这才是真正的高手。打个比方,把英语词典背的滚瓜烂熟,并不等于就能成为马克·吐温。鲁迅的文章里还竟是错字呢。再说你的代码也有不少错误的,比如你那个e.Result最后没有调用Close()方法关闭。而微软的WebCilent使用说明中明确指出这个内存流必须要调用Close()方法来释放资源。FileDownLoadStream.Close(); FileDownLoadStream.Dispose(); FileDownLoadStream = null;这句也是乱七八糟。微软的说明中写得很清楚Close()方法包含了Dispose()方法,在有Close()方法时应该使用Close()方法,没有时才使用Dispose()方法。而且当你使用了Close()方法以后,对象就已经被损毁了。所以你在FileDownLoadStream.Close(); 之后再调用FileDownLoadStream的Dispose()方法,实际上既是重复的,也是错误的。=null则不应该在.Net程序里使用,这个在.Net程序里没用,而且可能还会影响自动垃圾收集器。我不是很懂C#,所以没仔细看你写的代码,只是随便举这么两个例子而已。


    你的代码是正确的,就不知道你是否真正理解了两个流之间的关系。
    you code is perfect right. but i dont know if you fully understand the relation between the two streams.

    一个是对话框的文件流,一个是服务器发出的数据流。
    one stream is the savefiledialog stream. the other is the stream from server.

    那个SaveFileDialog应该只是个地址而已(有人把它比作C++里的指针,我也不知道对不对),所以我实在是搞不清你所说的这个什么流同步,也实在是搞不清那个SaveFileDialog和WebClient之间究竟有什么关系。至于你一开始所说的那个什么有难度、太简单、弱智问题,我就更不知道你是在指什么了。总之,我只是个行政人员,编程方面很业余,只能针对具体问题给出我的一点个人看法而已。如果有效当然是最好的了,如果无效或错误百出,请直接忽略就是了。如果想交流,我很愿意讨论。如果觉得我水平实在太差,解答的很没水平,请多包涵。
    2009年8月21日 17:38