C# – cannot convert from threading task to system action

ctaskthreadpool

i have problem to run task in button
Problem is : cannot convert from threading.task.task to system action
i marked the line in the button

         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;
}

Best Answer

public async Task MainAsync

should be changed to

public async Task<bool> MainAsync

And then instead of

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

you can use

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

Also you need to use async in the following line too:

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

Becomes:

var logoutResult = await _instaApi.LogoutAsync();
Related Topic