无法从线程任务 <bool> 转换为系统操作
cannot convert from threading task<bool> to system action
我对 运行 按钮中的任务有疑问
问题是:无法从 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;
}
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();
Task.Run
取Func<Task>
或Action
(当然你可以额外传CancellationToken
)。因此,对于您的情况,您需要传递一个 returns 任务并且不会尝试等待 void
的函数(我希望您记住您不能等待 void
)。刚得到任务结果:
Task.Run(() => MainAsync("", "", "", "", "", "")).GetAwaiter().GetResult();
您可以直接等待任务而不是上面的代码:
Task.Run(() => MainAsync("", "", "", "", "", "")).Wait();
但是,如果您想按任务结果异步继续您的工作流程,您的 MainAsync
应该 returns a Task<bool>
正如@Olexiy Sadovnikov 回答中指出的那样并等待返回的任务。
我对 运行 按钮中的任务有疑问 问题是:无法从 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; }
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();
Task.Run
取Func<Task>
或Action
(当然你可以额外传CancellationToken
)。因此,对于您的情况,您需要传递一个 returns 任务并且不会尝试等待 void
的函数(我希望您记住您不能等待 void
)。刚得到任务结果:
Task.Run(() => MainAsync("", "", "", "", "", "")).GetAwaiter().GetResult();
您可以直接等待任务而不是上面的代码:
Task.Run(() => MainAsync("", "", "", "", "", "")).Wait();
但是,如果您想按任务结果异步继续您的工作流程,您的 MainAsync
应该 returns a Task<bool>
正如@Olexiy Sadovnikov 回答中指出的那样并等待返回的任务。