Show/Hide Toolbars

XSharp

Navigation: X# 示例

ASYNC 示例

Scroll Prev Top Next More

//
// 这个示例说明,你可以调用一个异步任务并等待它完成。
// 异步任务的结果(在本例中为已下载文件的大小)
// 将在任务完成后可用
// 调用代码(Start())的函数无需等待异步任务完成。
// 完成。这就是为什么在 TestClass.DoTest() 的结果之前会打印出 "2..... "行的原因。
// 示例还显示了一个事件并显示了线程 ID。您可以看到 DownloadFileTaskAsync() 方法
// 启动多个线程下载多个网络文档。
 
USING System
USING System.Threading.Tasks
 
FUNCTION Start() AS VOID
   ? "1. 调用耗时比较长的过程"
   TestClass.DoTest()
   ? "2. 在处理过程中应打印出来"
   Console.ReadKey()
 
CLASS TestClass  
  STATIC PROTECT oLock AS OBJECT     // 确保我们的书写与屏幕同步
  STATIC CONSTRUCTOR
     oLock := OBJECT{}
 
  ASYNC STATIC METHOD DoTest() AS VOID
      LOCAL Size AS INT64
       Size := AWAIT LoooongProcess()
       ? "3. 从漫长的过程中返回"
       ? Size, " 字节已下载"
 
  ASYNC STATIC METHOD LoooongProcess() AS Task<INT64>
      VAR WebClient := System.Net.WebClient{}
      VAR FileName := System.IO.Path.GetTempPath()+"temp.txt"
       webClient:DownloadProgressChanged += OnDownloadProgress
       webClient:Credentials := System.Net.CredentialCache.DefaultNetworkCredentials
      AWAIT webClient:DownloadFileTaskAsync("http://www.xsharp.info/index.php", FileName)
      VAR dirInfo      := System.IO.DirectoryInfo{System.IO.Path.GetTempPath()}
      VAR Files        := dirInfo:GetFiles("temp.txt")
      IF Files:Length > 0
           System.IO.File.Delete(FileName)
          RETURN Files[1]:Length
      ENDIF
      RETURN 0
 
  STATIC METHOD OnDownloadProgress (sender AS OBJECT, e AS System.Net.DownloadProgressChangedEventArgs) AS VOID
    BEGIN LOCK oLock
        ? String.Format("{0,3} % Size: {1,8:N0} Thread {2}", 100*e:BytesReceived / e:TotalBytesToReceive , e:BytesReceived, ;
          System.Threading.Thread.CurrentThread:ManagedThreadId)
    END LOCK
    RETURN
 
END CLASS