首页 文章

无法从线程任务<bool>转换为系统操作

提问于
浏览
2

我有问题在按钮中运行任务问题是:无法从threading.task.task转换为系统操作我在按钮中标记了行

private async void BtnStart_Click(object sender, EventArgs e)
         { 

         if (String.IsNullOrEmpty( txtProxy.Text) || lstviewcomp.Items.Count==0)
        {
            MessageBox.Show("Please uploads files");
            return;
        }
        proxies = txtProxy.Text.Split('\n');
        proxycount = proxies.Length;
        foreach (string item in lstviewcomp.Items)
        {
            proxycount++;
            if (proxyCounter> proxycount)
            {
                proxyCounter = 0;
            }
            ProxyInfo = proxies[proxyCounter].Split(',');
            var result = await Task.Run( MainAsync("", "", "", "", "", "")).GetAwaiter().GetResult();// Problem in this line 


            // proxyCounter++;
        }
    }
 

 public async Task MainAsync(string instausername,string pass,string proxyip,string proxyport,string proxyusername,string proxypass)
        {
            try
            {
                // create user session data and provide login details
                var userSession = new UserSessionData
                {
                    UserName = instausername,
                    Password = pass
                };
                // create proxy handeler
                var httpHndler = new HttpClientHandler();
                IWebProxy proxy = new WebProxy(proxyip,Convert.ToInt32(proxyport));
                proxy.Credentials = new NetworkCredential(proxyusername, proxypass);
                httpHndler.Proxy = proxy;
                // create new InstaApi instance using Builder
                _instaApi = new InstaApiBuilder()
                    .SetUser(userSession)
                    .UseHttpClientHandler(httpHndler)
                    .UseLogger(logger: new DebugFileLogger()) // use logger for requests and debug messages
                    .SetRequestDelay(TimeSpan.FromSeconds(1)) // set delay between requests
                    .Build(); 

            // login
            txtLog.Text = txtLog.Text + $"Logging in as {userSession.UserName}"+" At "+DateTime.Now+"\n";
            var logInResult = await _instaApi.LoginAsync();
            if (!logInResult.Succeeded)
            {
                txtLog.Text = txtLog.Text + $"Unable to login: {logInResult.Info.Message}" + " At " + DateTime.Now + "\n";

            }
            else
            {
                txtLog.Text = txtLog.Text + $"Logging in success : {userSession.UserName}" + " At " + DateTime.Now + "\n";

            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
        finally
        {
            var logoutResult = Task.Run(() => _instaApi.LogoutAsync()).GetAwaiter().GetResult();
            if (logoutResult.Succeeded) txtLog.Text = txtLog.Text + "Logout sucess \n";

        }
        return false;
    }

2 回答

  • 2

    public async Task MainAsync

    应该改为

    public async Task<bool> MainAsync

    而不是

    var result = await Task.Run( MainAsync("", "", "", "", "", "")).GetAwaiter().GetResult();

    您可以使用

    var result = await MainAsync("", "", "", "", "", "");

    您还需要在以下行中使用 async

    var logoutResult = Task.Run(() => _instaApi.LogoutAsync()).GetAwaiter().GetResult();

    =>

    var logoutResult = await _instaApi.LogoutAsync();

  • 3

    Task.RunFunc<Task>Action (当然你可以通过另外的 CancellationToken ) . 因此,对于您的情况,您需要传递一个返回任务的函数,并且不会尝试等待 void (我希望您记得您不能等待 void ) . 只需获得任务结果:

    Task.Run(() => MainAsync("", "", "", "", "", "")).GetAwaiter().GetResult();
    

    您可以直接等待任务而不是上面的代码:

    Task.Run(() => MainAsync("", "", "", "", "", "")).Wait();
    

    但是如果你想通过任务'结果异步地继续你的工作流,你的_455234应该返回一个 Task<bool> ,正如@Olexiy Sadovnikov回答中所指出的并等待返回的任务 .

相关问题