【发布时间】:2017-07-14 03:07:55
【问题描述】:
对不起,它与其他帖子相似,但我已经阅读了一个小时类似的帖子,并审查/重新审查了我的代码,但我只是看不出它没有返回值的地方。任何帮助表示赞赏。
public static bool UploadLog()
{
var uploader = new BackgroundWorker();
uploader.DoWork += delegate (object sender, DoWorkEventArgs e)
{
Properties.Settings.Default.logUrl = "";
Properties.Settings.Default.Save();
System.Collections.Specialized.NameValueCollection Data = new System.Collections.Specialized.NameValueCollection();
Data["api_paste_name"] = "RWC_Log_" + DateTime.Now.ToString() + ".log";
Data["api_paste_expire_Date"] = "N";
Data["api_paste_code"] = File.ReadAllText(Properties.Settings.Default.AppDataPath + @"\Logs\RWC.log");
Data["api_dev_key"] = "017c00e3a11ee8c70499c1f4b6b933f0";
Data["api_option"] = "paste";
WebClient wb = Proxy.setProxy();
try
{
byte[] bytes = wb.UploadValues("http://pastebin.com/api/api_post.php", Data);
string response;
using (MemoryStream ms = new MemoryStream(bytes))
using (StreamReader reader = new StreamReader(ms))
response = reader.ReadToEnd();
if (response.StartsWith("Bad API request"))
{
Logging.LogMessageToFile("Failed to upload log to Pastebin: " + response);
e.Result = false;
}
else
{
Logging.LogMessageToFile("Logfile successfully uploaded to Pastebin: " + response);
Properties.Settings.Default.logUrl = response;
Properties.Settings.Default.Save();
e.Result = true;
}
}
catch (Exception ex)
{
Logging.LogMessageToFile("Error uploading logfile to Pastebin: " + ex.Message);
e.Result = false;
}
};
uploader.RunWorkerAsync();
}
编辑:我已经尝试以async 运行此函数,但它导致 UI 锁定,因此在后台工作程序中运行此函数。
【问题讨论】:
-
紧跟在
uploader.RunWorkerAsync();之后,没有返回值。 -
Not all code paths return a value我想你会发现这里实际上有没有个返回值的代码路径。 -
Abion47 完全正确:)
-
你的方法声明声明了一个布尔返回值。 public static bool UploadLog(),因此,您的所有代码路径都必须返回一个 bool。通过代码路径......您方法的所有“退出点”都必须返回一个值。除非您将“bool”更改为“void”,这仅意味着您的方法不会返回值。
-
从设计的角度来看,无论如何您都应该将方法更改为
void。我对您尝试做的事情的理解是返回异步过程是否成功完成。但是,为了做到这一点,您必须等待该过程完成,这违背了异步调用它的目的。相反,您应该完全忽略工作人员并让它做自己的事情,然后使用worker.RunWorkerCompleted事件检查它是否成功完成。
标签: c# winforms boolean backgroundworker