为什么我的RunWorkerCompleted没有收到RunWorkerCompletedEventArgs

本文关键字:RunWorkerCompletedEventArgs 我的 RunWorkerCompleted 为什么 | 更新日期: 2023-09-27 17:57:41

我可以从调试消息中看到,e.Result在DoWorker方法中一直等于"Success",但在RunWorkerCompleted方法的开头。

这是WinForm 的__构造

public LicenseValidator()
{
    // Initialize the UI
    InitializeComponent();
    // Start the background worker
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
    worker.RunWorkerAsync();
    // Tell debug log that the UI thread is still processing
    Debug.WriteLine("UI thread running");  
}

这是我的worker_DoWork方法

public async void worker_DoWork(object sender, DoWorkEventArgs e)
{
    // Tell debug log that the worker thread is now running
    Debug.WriteLine("Worker thread running");
    // Define variables
    String HWID = Security.FingerPrint.Value();
    String APIPath = "http://xxxxxxxxx.net/api.php";
    String Serial;
    HttpClient client = new HttpClient();
    HttpResponseMessage response;
    String responseString;
    // Check for license in AppData
    try{
        // Get license path
        String licensePath = Environment.GetEnvironmentVariable("APPDATA") + @"'UniLeech'License.txt";
        // License exists, validate it
        if (File.Exists(licensePath))
        {
            Serial = File.ReadAllText(licensePath);
            Debug.WriteLine(Serial);
            response = await client.GetAsync(APIPath + "?hwid=" + HWID + "&serial=" + Serial);
            responseString = await response.Content.ReadAsStringAsync();
            Debug.WriteLine(responseString);
            dynamic jObj = JsonConvert.DeserializeObject(responseString);
            if (jObj.success == "true")
            {
                Debug.WriteLine("License validation was successful");
                e.Result = "Success";
            }
            else
            {
                e.Result = jObj.error;
            }
            Debug.WriteLine(e.Result);
        }
        // License does not exist, prompt for one
        else
        {
            Debug.WriteLine("License file not found");
            e.Result = "Unregistered";
        }
    }

终于我的worker_RunWorkerCompleted方法

public void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Debug.WriteLine("Worker completed");
    String result = e.Result as String;
    if ((e.Error == null))
    {
        Debug.WriteLine("No errors");
        Debug.WriteLine("Result = " + result);
        if (e.Cancelled)
        {
            Debug.WriteLine("Worker cancelled");
        }
        switch ((String)e.Result.ToString())
        {
            case "Success":
                this.Hide();
                this.ShowInTaskbar = false;
                Main mainForm = new Main();
                mainForm.Show();
                break;
            case "Banned":
                popupError("ERROR: License revoked!",
                           "Your license has been revoked, contact Time Sheep for more information. You can purchase a new one by visiting the ordinary order link."
                          );
                break;
            case "Invalid":
                popupError("ERROR: Invalid serial/HWID",
                           "Either your serial number or hardware identifier was invalid. If you purchased UniLeech, please contact Time Sheep with proof of purchase."
                          );
                break;
            case "Unregistered":
                this.Hide();
                this.ShowInTaskbar = false;
                Register registerForm = new Register();
                registerForm.Show();
                break;
            default:
                MessageBox.Show((string)e.Result, "ERROR");
                break;
        }
    }
}

执行时会出现以下调试消息(示例:我有文件和e。结果应该是"成功"):

UI thread running
Worker thread running
0123-1234-1234 (The value of Serial)
Worker completed
No errors
{"success": "true","action": "validate","error": "None"} (Returned from web API)
License validation was successful
Success
RunWorkerCompleted finished

我怀疑这个问题是由DoWork方法异步引起的,但我不知道如何同步使用HttpClient。

为什么我的RunWorkerCompleted没有收到RunWorkerCompletedEventArgs

不能有async DoWorkBackgroundWorker假设当DoWork返回时,它就完成了。

你根本不需要BackgroundWorker。只需使用Task.Run即可。

相关文章:
  • 没有找到相关文章