我对facebooksdk很新,但我在c#中有一个winform项目来执行简单的状态发布&照片上传使用它。
到目前为止,SDK还是如此之好,但是,FacebookClient.Post与...之间的区别是什么? FacebookClient.PostTaskAync?
我使用以下代码将照片发布到我的Facebook帐户:
public static void uploadPhoto(string fPath, string userMsg, string imgType = "")
{
var fb = new FacebookClient(AccessToken);
if (imgType.Equals(""))
imgType = "image/jpeg";
using (var file = new FacebookMediaStream
{
ContentType = imgType,
FileName = Path.GetFileName(fPath)
}.SetValue(File.OpenRead(fPath)))
{
dynamic result = fb.Post("me/photos",
new { message = userMsg, file });
}
}
但是,当文件大小很大时,上面的方法将“挂起”我的系统,因为主线程仍在工作,所以我尝试了以下方法:
dynamic result = fb.PostTaskAsync("me/photos",
new { message = userMsg, file });
但它不起作用(至少照片没有上传到我的fb帐户)...
我真正想要的是避免在我的系统上出现“悬挂”的感觉,我甚至尝试过“Application.DoEvents()”,但没有运气。
有任何建议可以处理此问题吗? 我可以使用另一个线程处理这张照片上传吗? 或?
感谢所有答案&评价。
答案 0 :(得分:0)
您是否尝试过使用async / await?
下面显然是一个很小的例子,但请注意:
这意味着只有完成后,结果才会被封送回UI线程,并且您的UI将保持响应。 请参阅:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += OnLoad;
}
private const string AccessToken = "xxxxxxxxxxxxxx";
private const string imgType = "image/jpeg";
private const string fPath = "c:\bob.jpg";
private const string userMsg = "My Message";
private async void OnLoad(object sender, EventArgs e)
{
await DoSomething();
}
private async Task DoSomething()
{
var fb = new FacebookClient(AccessToken);
using (var file = new FacebookMediaStream
{
ContentType = imgType,
FileName = Path.GetFileName(fPath)
}.SetValue(File.OpenRead(fPath)))
{
dynamic result = await fb.PostTaskAsync("me/photos",
new { message = userMsg, file });
}
}
}
答案 1 :(得分:0)
似乎我设法使用我的VS2010 .net4.0上的System.Threading.Tasks处理它,具体如下:
// For Tasks
private static Task _taskUpload = null;
private static string _fPath = "";
private static string _userMsg = "";
private static string _imgType = "";
/// <summary>
/// used to post photo to facebook
/// </summary>
/// <param name="fPath"></param>
/// <param name="userMsg"></param>
/// <param name="imgType"></param>
public static void uploadPhoto(string filePath, string userMsg, string imgType = "")
{
// Assign Values
_fPath = filePath;
_userMsg = userMsg;
_imgType = imgType;
// Start Task
_taskUpload = Task.Factory.StartNew(new Action(processUploadPhoto));
}
/// <summary>
/// Used to process actual upload of photo to FB
/// </summary>
private static void processUploadPhoto()
{
var fb = new FacebookClient(AccessToken);
if (_imgType.Equals(""))
_imgType = "image/jpeg";
using (var file = new FacebookMediaStream
{
ContentType = _imgType,
FileName = Path.GetFileName(_fPath)
}.SetValue(File.OpenRead(_fPath)))
{
dynamic result = fb.Post("me/photos",
new { message = _userMsg, file });
}
}
感谢您的所有建议。